Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无objc协议中的Swift可选方法_Swift - Fatal编程技术网

无objc协议中的Swift可选方法

无objc协议中的Swift可选方法,swift,Swift,我知道,在Swift协议中创建一些方法需要使用@objc协议。问题是,我不能使用objective c方式,因为协议中有一个方法,它返回一个Swift结构。所以我得到了一个错误,我不能使用@objc协议,因为我的方法返回一个结果,这个结果不能在目标c中表示 不幸的是,我绝对希望使用可选方法,因为有两种方法,它们是可选的,我的类的用户应该选择使用哪种方法。在这种情况下,我要做的是返回一个类(与Objective-C兼容),该类封装了Swift结构。换句话说,只要使Objective-C看到的一切都

我知道,在Swift协议中创建一些方法需要使用
@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 }
}