为什么这个Swift代码没有编译?
protocol P { }
struct S: P { }
let arr:[P] = [ S() ]
extension Array where Element : P {
func test<T>() -> [T] {
return []
}
}
let result : [S] = arr.test()
Run Code Online (Sandbox Code Playgroud)
编译器说:"类型P
不符合协议P
"(或者,在Swift的更高版本中,"不支持使用'P'作为符合协议'P'的具体类型.").
为什么不?不知怎的,这感觉就像语言中的漏洞.我意识到问题源于将数组声明arr
为协议类型的数组,但这是不合理的事情吗?我认为协议正是为了帮助提供类似层次结构的结构?
我正在使用Swift 2并使用WeakContainer作为存储一组弱对象的方式,就像 NSHashTable.weakObjectsHashTable()
struct WeakContainer<T: AnyObject> {
weak var value: T?
}
public protocol MyDelegate : AnyObject {
}
Run Code Online (Sandbox Code Playgroud)
然后在我的ViewController中,我声明
public var delegates = [WeakContainer<MyDelegate>]
Run Code Online (Sandbox Code Playgroud)
但这是错误的
使用MyDelegate作为符合协议AnyObject的具体类型不受支持
我看到的错误是,WeakContainer
具有value
声明为成员weak
,因此T
有望成为对象.但我也声明MyDelegate
为AnyObject
也.怎么解决这个问题?
我有一个协议,Address
它继承自另一个协议Validator
,并Address
满足Validator
扩展中的要求.
还有另一个协议,FromRepresentable
它有一个associatedType
(ValueWrapper
)要求Validator
.
现在,如果我尝试使用Address
as associatedType
,那么它不会编译.它说,
推断类型'Address'(通过匹配要求'valueForDetail')无效:不符合'Validator'.
这种用法是非法的吗?我们是不是应该能够使用Address
的地方Validator
,因为所有Addresses
都是Validator
.
下面是我正在尝试的一段代码.
enum ValidationResult {
case Success
case Failure(String)
}
protocol Validator {
func validate() -> ValidationResult
}
//Address inherits Validator
protocol Address: Validator {
var addressLine1: String {get set}
var city: String {get set}
var country: String {get set}
}
////Fulfill Validator protocol requirements in extension
extension …
Run Code Online (Sandbox Code Playgroud)