【问题标题】:Are optional protocols from Objective-C not something that should be done in Swift?来自 Objective-C 的可选协议不应该在 Swift 中完成吗?
【发布时间】:2014-11-15 19:17:44
【问题描述】:

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

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

我们应该做一些更 Swift-esque 的事情吗?通过花哨的闭包什么的?

【问题讨论】:

  • 我一直认为这是语言中缺少的东西。
  • @Lance 有待实现,还是有意省略?
  • 我会假设故意省略,与接口相同。
  • @DougSmith 我认为尚未实现,但也许这是一厢情愿:)
  • @Zaph 协议接口还是我缺少一些区别?

标签: ios objective-c cocoa-touch swift protocols


【解决方案1】:

this Developer Forums topic:

协议中的可选方法仅限于@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()

你不能声明多个相似的委托方法名称:

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

【讨论】:

  • 斯威夫特:很丑,明白了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-18
  • 2018-05-16
  • 1970-01-01
  • 1970-01-01
  • 2014-12-15
相关资源
最近更新 更多