无objc协议中的Swift可选方法
我知道,在Swift协议中创建一些方法需要使用无objc协议中的Swift可选方法,swift,Swift,我知道,在Swift协议中创建一些方法需要使用@objc协议。问题是,我不能使用objective c方式,因为协议中有一个方法,它返回一个Swift结构。所以我得到了一个错误,我不能使用@objc协议,因为我的方法返回一个结果,这个结果不能在目标c中表示 不幸的是,我绝对希望使用可选方法,因为有两种方法,它们是可选的,我的类的用户应该选择使用哪种方法。在这种情况下,我要做的是返回一个类(与Objective-C兼容),该类封装了Swift结构。换句话说,只要使Objective-C看到的一切都
@objc协议
。问题是,我不能使用objective c方式,因为协议中有一个方法,它返回一个Swift结构。所以我得到了一个错误,我不能使用@objc协议,因为我的方法返回一个结果,这个结果不能在目标c中表示
不幸的是,我绝对希望使用可选方法,因为有两种方法,它们是可选的,我的类的用户应该选择使用哪种方法。在这种情况下,我要做的是返回一个类(与Objective-C兼容),该类封装了Swift结构。换句话说,只要使Objective-C看到的一切都与Objective-C兼容,并且在里面你可以做任何你喜欢的事情。好吧,我想我有一个解决方案给你 首先是具有所需方法的协议 然后,您需要定义尽可能多的协议来表示所需的可选方法的各种组合
protocol APrimo {
func B() -> ()
}
protocol ASecundo {
func C() -> ()
}
最后,您将定义类实现的协议
class AClass: A, ASecundo {
func A() -> () { }
func C() -> () { }
}
旁注:您当然可以将可选协议定义为从所需协议继承而来。我发现我在这里使用的样式更好,但那只是我自己。协议扩展
Swift 3
不处理objective-C兼容性的另一种方法是使用协议扩展支持的选项
定义可选属性或方法:
protocol MyProtocol {
var optionalProperty: Int? { get }
var requiredProperty: Int { get }
}
通过使用计算属性扩展MyProtocol
,实现可选的默认行为:
现在您可以创建不需要
optionalProperty
实现的“MyProtocol
继承结构”。这两种方法是什么?它们能结合起来吗?不幸的是,我认为这在当前版本的Swift中是不可能的。你可能想。也许合并是一种方式,我会试试,谢谢!当然,这是一种方式,但(在我看来)不是很美;)不过,非常感谢你的回答,我能理解。对我来说,这看起来很像一个带有一些扩展的类。有一些扩展的协议。我喜欢那种对称。未来会告诉我们,但我也认为这将是Swift的一种常见模式。谢谢。但是我怎样才能使结构与objc兼容呢?我刚刚告诉过你,你不必这么做。这就是重点。这个类是兼容的,这才是最重要的。Objective-C不在乎里面有什么,这不完全正确!只有NSObject的一个类是兼容的。我必须添加类myClass:NSObject{。但是它可以工作。(不幸的是,我需要一个初始化器来初始化这个类->更多代码)我说的是对的。我说的是一个与Objective-C兼容的类。
protocol MyProtocol {
var optionalProperty: Int? { get }
var requiredProperty: Int { get }
}
extension MyProtocol {
var optionalProperty: Int? { return nil }
}