没有 objc 的协议中的 Swift 可选方法

Posted

技术标签:

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

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

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

【问题讨论】:

这两种方法是什么?它们可以结合起来吗?不幸的是,我认为这在当前版本的 Swift 中是不可能的。你可能想file a bug。 也许合并是一种方法,我试试,谢谢! 【参考方案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 继承结构”。

【讨论】:

以上是关于没有 objc 的协议中的 Swift 可选方法的主要内容,如果未能解决你的问题,请参考以下文章

swift之@objc

Swift 中的 ObjC 协议实现

我们可以为返回可选值的 swift 函数添加 @objc 吗?

swift 1.2 版中的 iCarousel 错误(候选不是 Objc 但协议需要它)

@objc 协议使 swift 编译器崩溃

用 Swift 中使用的 ObjC 编写的消除歧义覆盖方法