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

3
我知道,在Swift协议中使用某些方法需要使用@objc protocol。问题在于,我不能使用Objective-C的方式,因为我的协议中有一个返回Swift结构体的方法。所以我会得到一个错误,说我不能使用@objc协议,因为我的方法返回了一个无法在Objective-C中表示的结果。
不幸的是,我绝对想使用可选方法,因为有两种方法是替代的,我的类的用户应该选择他想要使用的方式。

这两种方法是什么?它们可以结合使用吗?不幸的是,我认为在当前版本的Swift中这是不可能的。您可能需要提交错误报告 - jtbandes
也许合并是一种方法,我会尝试的,谢谢! - Lupurus
3个回答

2

我在这种情况下会返回一个类(与Objective-C兼容),该类包装Swift结构体。换句话说,只要让Objective-C看到的一切都与Objective-C兼容,你可以在其中做任何你想做的事情。


谢谢。但是我该如何使一个结构与 Obj C 兼容? - Lupurus
我刚告诉你不需要这样做。这就是重点。这个类是兼容的,这才是最重要的。Objective-C并不关心里面有什么。 - matt
这不完全正确!只有NSObject类的一个子类是兼容的。我必须添加class myClass: NSObject {。但是这样就可以了。(不幸的是,我需要为类添加初始化程序->更多代码) - Lupurus
我说的是正确的。我说了一个与Objective-C兼容的类。 - matt

1
我认为我可以为你提供帮助。这是一个与所需方法相关的协议。请参考以下内容:

Well, I think I've a solution for you.

首先,这是一个包含所需方法的协议。

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

然后,您可以定义尽可能多的协议来表达所需的各种可选方法的组合。
protocol APrimo {
  func B() -> ()
}

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

最后但并非最不重要的,您将定义您的类实现哪些协议。

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

顺带一提:当然,你可以将可选协议定义为继承自必需协议。我发现我在这里使用的风格更好,但那只是我的看法。


1
当然,那是一种方法,但在我看来并不是很优美 ;) 尽管如此,非常感谢您的回答。 - Lupurus
我能理解。对我来说,这看起来很像一个带有一些扩展的类。一种带有一些扩展的协议,有点像。我喜欢这种对称性。未来会告诉我们,但我也认为这将成为Swift中常见的模式。 - fabrice truillot de chambrier

0

协议扩展

Swift 3

另一种解决这个问题的方法,而不必处理Objective-C兼容性,是使用由协议扩展支持的可选项。

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

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

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

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

现在您可以创建继承结构的 'MyProtocol',而不需要实现 optionalProperty


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接