Objective-C的可选协议不是应该在Swift中完成的吗?

Dou*_*ith 4 cocoa-touch protocols objective-c ios swift

在Objective-C中,使用符合协议并设置委托以允许两个对象相互通信是一种非常常见的范例.这部分是,他们没有任择议定书必须实现.

似乎Swift并不认为这是它的语言的一部分.它有协议,但为了将协议中的方法标记为可选,协议需要一个objc前缀,告诉我它也是一个Objective-C遗物?

我们应该做些什么而不是Swift-esque?通过花哨的关闭或什么?

rin*_*aro 6

此开发人员论坛主题中:

协议中的可选方法仅限于@objc协议,因为我们尚未在本机协议中实现它们.这是我们计划支持的.


虽然您可以在纯Swift中使用可选方法实现委托模式,但它非常难看......

protocol MyOperationDelegate:class {
    var operation:Optional<(MyOperation, didComplete:Bool) -> Void> { get }
}

class MyOperation {
    weak var delegate:MyOperationDelegate?

    func start() {
        println("started")
        self.delegate?.operation?(self, didComplete:true)
    }
}

class Operator:MyOperationDelegate {

    func doOperate() {
        let operation = MyOperation()
        operation.delegate = self
        operation.start()
    }

    var operation:((MyOperation, didComplete:Bool) -> Void)? { return self._operation }
    func _operation(operation:MyOperation, didComplete:Bool) {
        println("operation: \(operation) didComplete:\(didComplete)")
    }
}

let op = Operator()
op.doOperate()
Run Code Online (Sandbox Code Playgroud)

并且您不能声明多个类似的委托方法名称:

protocol MyOperationDelegate {
    var operation:Optional<(MyOperation, didComplete:Bool) -> Void> { get }
    var operation:Optional<(MyOperation, inProgress:) -> Void> { get }
//      ^ [!] Invalid redeclaration of 'operation'
}
Run Code Online (Sandbox Code Playgroud)