swift中的可选协议方法,不使用@objc

时间:2018-02-17 04:39:51

标签: swift methods protocols optional swift-extensions

在swift中使用@objc,我们可以在协议中创建一个可选方法,如

max-width: 100%

但是如何在不使用@objc的情况下创建可选的协议方法?

4 个答案:

答案 0 :(得分:8)

您可以通过以下方式定义默认func实现:

protocol Opt {
    func requiredFunc()
    func optionalFunc()
}

extension Opt {
    func optionalFunc() {}
}

有了这个,你不必在符合Opt的类中实现optionalFunc(),因为它们已经有了默认的实现。

答案 1 :(得分:1)

让我们使用该协议的扩展创建一个可选的协议方法并使用它:

   //: Playground - noun: a place where people can play

   import UIKit

   protocol someProtocol {
     func a()
     func b()
   }

  extension someProtocol {
    func c() {
        print("This is optional protocol method")
     }

    var someProperty: String { 
        return "some optional computed property"
    }
  }

 class A: someProtocol {
   func a() {
       print("a")
    }

   func b() {
      print("b")
   }

   // It's upto you to implement c() functionality, 
   // this is an optional protocol method

   func c() {
      print("I am overriding C functionality")
   }
  }

 let obj = A()
 obj.a()
 obj.b()
 obj.c()
 print(obj.someProperty)

输出:

 a
 b
 I am overriding C functionality
 some optional computed property

答案 2 :(得分:0)

Swift协议不支持可选方法。

Apple Docs:

  

可选协议要求

     

您可以定义协议的可选要求,这些要求   不必由符合协议的类型实现。   可选要求以可选修饰符作为其一部分作为前缀   协议的定义。可选要求是可用的   您可以编写与Objective-C互操作的代码。 两者都有   协议和可选要求必须用@objc标记   属性。请注意,@ objc协议只能由类采用   继承自Objective-C类或其他@objc类。他们   结构或枚举不能采用。

Apple Protocol Documentation

答案 3 :(得分:0)

协议中可选方法的一个常见用途是定义委托可以侦听的可选回调。使用protocol + extension方法可以最好地实现此方案(为高可选方法提供无用的默认实现)。

对于其他一些情况,使用多种协议可能更合适:

protocol Storage {
    func read() -> Data
}

protocol MutableStorage: Storage {
    func write(data: Data
}

标准库对SequenceCollection和朋友使用此方法。