通过在Swift中使用@objc,我们可以在协议内创建可选方法,例如:
@objc protocol MyProtocol {
@objc optional func anOptionalMethod()
}
但是如何在不使用 @objc 的情况下创建可选协议方法呢?
通过在Swift中使用@objc,我们可以在协议内创建可选方法,例如:
@objc protocol MyProtocol {
@objc optional func anOptionalMethod()
}
你可以通过以下方式定义默认的函数实现:
protocol Opt {
func requiredFunc()
func optionalFunc()
}
extension Opt {
func optionalFunc() {}
}
使用这个方法,您不需要在符合Opt标准的类中实现optionalFunc(),因为它们已经有了默认实现。
Swift协议不支持可选方法。
Apple文档:
可选协议要求
您可以为协议定义可选要求,这些要求不需要被符合协议的类型实现。可选要求在协议的定义中以可选修饰符作为前缀。可选要求可用于编写与Objective-C互操作的代码。协议和可选要求都必须标有@objc属性。请注意,@objc协议只能被继承自Objective-C类或其他@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)
a
b
I am overriding C functionality
some optional computed property
协议中可选方法的常见用途是定义委托可以监听的可选回调。这种情况最好使用 protocol
+ extension
方法(为所有可选方法提供无操作的默认实现)来实现。
对于其他一些情况,使用多个协议可能更合适:
protocol Storage {
func read() -> Data
}
protocol MutableStorage: Storage {
func write(data: Data
}
Sequence
、Collection
和相关类中采用了这种方法。