Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Objective-C的任择议定书不是Swift中应该做的事情吗?_Ios_Objective C_Cocoa Touch_Swift_Protocols - Fatal编程技术网

Ios Objective-C的任择议定书不是Swift中应该做的事情吗?

Ios Objective-C的任择议定书不是Swift中应该做的事情吗?,ios,objective-c,cocoa-touch,swift,protocols,Ios,Objective C,Cocoa Touch,Swift,Protocols,在Objective-C中,遵守协议并设置委托以允许两个对象相互通信是一种非常常见的范例。其中一部分是他们不必实施的可选协议 看来斯威夫特并不真的认为这是它的语言的一部分。它有协议,但为了将协议中的方法标记为可选,协议需要一个objc前缀,告诉我它也是Objective-C遗留物 我们是否应该采取更迅速的措施?传递花哨的闭包之类的东西?在: 协议中的可选方法仅限于@objc协议,因为我们还没有在本机协议中实现它们这是我们计划支持的内容 虽然您可以用纯Swift中的可选方法实现委托模式,但它非常

在Objective-C中,遵守协议并设置委托以允许两个对象相互通信是一种非常常见的范例。其中一部分是他们不必实施的可选协议

看来斯威夫特并不真的认为这是它的语言的一部分。它有协议,但为了将协议中的方法标记为可选,协议需要一个
objc
前缀,告诉我它也是Objective-C遗留物

我们是否应该采取更迅速的措施?传递花哨的闭包之类的东西?

在:

协议中的可选方法仅限于@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()
协议代理:类{
var操作:可选的Void>{get}
}
类手术{
弱var委托:MyOperationDelegate?
func start(){
println(“已启动”)
self.delegate?操作?(self,didComplete:true)
}
}
类运算符:MyOperationDelegate{
func doOperate(){
let operation=MyOperation()
operation.delegate=self
操作。开始()
}
var操作:((MyOperation,didComplete:Bool)->Void){返回self.\u操作}
func_操作(操作:MyOperation,didComplete:Bool){
println(“操作:\(操作)完成:\(完成)”)
}
}
设op=Operator()
op.doOperate()
并且不能声明多个类似的委托方法名称:

protocol MyOperationDelegate {
    var operation:Optional<(MyOperation, didComplete:Bool) -> Void> { get }
    var operation:Optional<(MyOperation, inProgress:) -> Void> { get }
//      ^ [!] Invalid redeclaration of 'operation'
}
协议代理{
var操作:可选的Void>{get}
var操作:可选的Void>{get}
//^[!]对“操作”的重新声明无效
}

我一直认为这是语言中缺少的东西。@Lance As在一些尚未实现的东西中,或者故意省略?我会假定故意省略,与接口一样。@DougSmith我假定尚未实现,但这可能是一厢情愿的想法:)@Zaph协议是接口,还是我遗漏了一些区别?斯威夫特:非常难看,明白了。