我创建了一个用于绑定块的小协议(这是 Swift
中 KVO 的一些循环)代码在这里:
typealias storedClosure = (object: Any) -> Void
protocol BindingProtocol {
var binders: [String : storedClosure]! { get set }
func bind(string: String, block: storedClosure)
}
extension BindingProtocol {
mutating func bind(string: String, block: storedClosure) {
if binders == nil {
binders = [String : storedClosure]()
}
binders[string] = block
}
}
在我尝试继承此协议后Xcode
我遇到崩溃或编译错误,例如Command failed due to signal: Segmentation fault: 11
class View : UIView, BindingProtocol {
var binders: [String : (object: Any) -> Void]!
}
有什么想法吗?
你的财产没有问题,但你的方法...
protocol BindingProtocol {
var binders: [String : storedClosure]! { get set }
func bind(string: String, block: storedClosure) //<--- 1.This
}
extension BindingProtocol {
mutating func bind(string: String, block: storedClosure) { //<--- 2.This
if binders == nil {
binders = [String : storedClosure]()
}
binders[string] = block
}
}
您在第 1 点将方法定义为普通方法,并在第 2 点将其实现为突变。
它们具有相同的签名,但实际上是两种不同的方法。在这种情况下,斯威夫特没有找到合适的电话。当我使用默认实现的协议时,这是我一直遇到的常见问题。
一个解决方案就是改变...
protocol BindingProtocol {
...
//From
//func bind(string: String, block: storedClosure)
//To
mutating func bind(string: String, block: storedClosure)
}