【问题标题】:Swift optional method in protocol without objc没有 objc 的协议中的 Swift 可选方法
【发布时间】:2014-08-02 19:08:58
【问题描述】:

我知道,在 Swift 协议中创建一些方法需要使用@objc protocol。问题是,我不能使用目标 c 方式,因为我在协议中有一个方法,它返回一个 Swift 结构。所以我得到了错误,我不能使用@objc 协议,因为我的方法返回一个结果,它不能在目标 c 中表示。

不幸的是,我绝对想使用可选方法,因为有两种方法,它们是可选的,我的班级的用户应该选择他想要使用的方式。

【问题讨论】:

  • 这两种方法是什么?它们可以结合起来吗?不幸的是,我认为这在当前版本的 Swift 中是不可能的。你可能想file a bug
  • 也许合并是一种方法,我试试,谢谢!

标签: swift


【解决方案1】:

在这种情况下,我要做的是返回一个包装 Swift 结构的类(与 Objective-C 兼容)。换句话说,只要让 Objective-C 看到的所有东西都与 Objective-C 兼容,并且在其中你可以做任何你喜欢的事情。

【讨论】:

  • 谢谢。但是如何使结构与 Obj C 兼容?
  • 我刚刚告诉过你,你不必这样做。这才是重点。类 is 兼容,这才是最重要的。 Objective-C 不关心里面有什么。
  • 这不完全正确!只有一个 NSObject 的类是兼容的。我必须添加类 myClass: NSObject {。但它的工作原理。 (不幸的是,我需要一个类的初始化器 -> 更多代码)
  • 我说的是对的。我说的是与Objective-C兼容的类。
【解决方案2】:

好吧,我想我有一个适合你的解决方案。

首先是具有所需方法的协议。

protocol A {
  func A() -> ()
}

然后,您可以定义尽可能多的协议来表达所需的可选方法的各种组合。

protocol APrimo {
  func B() -> ()
}

protocol ASecundo {
  func C() -> ()
}

最后但同样重要的是,您将定义您的类实现哪些协议。

class AClass: A, ASecundo {
  func A() -> () { }
  func C() -> () { }
}

旁注:您当然可以将可选协议定义为从所需协议继承。我发现我在这里使用的风格更好,但这只是我。

【讨论】:

  • 当然,这是一种方式,但它不是很漂亮(在我看来);)不过非常感谢您的回答
  • 我能理解。嗯,对我来说,这看起来很像一个带有一些扩展的类。一种带有一些扩展的协议。我喜欢这种对称。未来会证明一切,但我也认为这将成为 Swift 中的一种常见模式。
【解决方案3】:

协议扩展

斯威夫特 3

在不处理 Objective-C 兼容性的情况下解决此问题的另一种方法是使用由协议扩展支持的选项。

定义你的可选属性或方法:

protocol MyProtocol {
    var optionalProperty: Int? { get }
    var requiredProperty: Int { get }
}

通过使用计算属性扩展MyProtocol来实现可选的默认行为:

extension MyProtocol {
    var optionalProperty: Int? { return nil }
}

现在您可以创建不需要optionalProperty 实现的“MyProtocol 继承结构”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-26
    • 2016-03-09
    • 1970-01-01
    • 2017-01-17
    • 2017-01-22
    • 1970-01-01
    • 2016-12-31
    相关资源
    最近更新 更多