This question already has answers here:
How to make generics in collection type constraint?
(3个答案)
两年前关闭。
如何将扩展限制为仅在关联类型为可选时匹配?
例如:
此错误与扩展的左大括号上的
(3个答案)
两年前关闭。
如何将扩展限制为仅在关联类型为可选时匹配?
例如:
protocol FooProtocol: class {
associatedtype BarType
var contents: BarType { get }
}
extension FooProtocol where BarType: Optional<Any> {
func unwrap() -> BarType {
return self.contents!
}
}
class BazClass: FooProtocol {
typealias BarType = String?
var contents: BarType
}
此错误与扩展的左大括号上的
Type 'Self.BarType' constrained to non-protocol type 'Optional<Any>'
有关。我也试过用Any?
,BarType?
代替Optional<Any>
。最后一个错误用Inheritance from non-named type 'BarType?'
代替。 最佳答案
String和Optional是值类型,而不是协议。这就是为什么你不能说BarType: Optional<String>
,因为没有任何东西可以从中继承。
您可以使用相同的类型约束(但这仅在Swift 4中可能),在Swift 3.1中似乎也适用:
extension FooProtocol where BarType == String? {
// ...
}
10-01 17:57