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

swift中不使用@objc的可选协议方法,swift,methods,protocols,optional,swift-extensions,Swift,Methods,Protocols,Optional,Swift Extensions,在swift中使用@objc,我们可以在协议中创建一个可选方法,如 @objc protocol MyProtocol { @objc optional func anOptionalMethod() } 但是如何在不使用@objc的情况下创建可选协议方法呢?让我们使用该协议的扩展创建可选协议方法并使用它: //: Playground - noun: a place where people can play import UIKit protocol somePr

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

@objc protocol MyProtocol {
  @objc optional func anOptionalMethod()
}

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

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

   //: 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)
输出:
Swift协议不支持可选方法

苹果文档:

任择议定书要求

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


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

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

extension Opt {
    func optionalFunc() {}
}

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

协议中可选方法的一个常见用法是定义委托可以侦听的可选回调。此场景最好使用
协议
+
扩展
方法实现(为可选方法中的任何一种方法提供不做任何事的默认实现)

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

protocol Storage {
    func read() -> Data
}

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

标准库对
序列
集合
和朋友使用此方法。

您不能,因为它们是特定于ObjC的。最简单的方法是在扩展中提供空的默认实现,然后根据需要重写这些实现。这不是可选的协议方法。不管它是否被覆盖,总会有一个实现完成,所以它不是可选的。苹果在他们的许多协议中使用关键字“可选”,用Swift编写,没有使用@objc。(示例:UITextFieldDelegate)你知道怎么做吗?我相信UITextFieldDelegate实际上被定义为一个ObjC接口。我认为你可能是对的。我只是没有看到@interface或Objective-C代码,而是看到Swift和protocol关键字。所以,我有点搞不清是什么机制使它起作用的。谢谢你的回复。
protocol Storage {
    func read() -> Data
}

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