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

时间:2014-08-02 19:08:58

标签: swift

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

好吧,我想我已经找到了解决方案。

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

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

然后,您需要定义所需数量的协议来表达您需要的可选方法的各种组合。

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

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

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

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

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

答案 2 :(得分: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继承结构”。