在swift中使用@objc,我们可以在协议中创建一个可选方法,如
max-width: 100%
但是如何在不使用@objc的情况下创建可选的协议方法?
答案 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类。他们 结构或枚举不能采用。
答案 3 :(得分:0)
协议中可选方法的一个常见用途是定义委托可以侦听的可选回调。使用protocol
+ extension
方法可以最好地实现此方案(为高可选方法提供无用的默认实现)。
对于其他一些情况,使用多种协议可能更合适:
protocol Storage {
func read() -> Data
}
protocol MutableStorage: Storage {
func write(data: Data
}
标准库对Sequence
,Collection
和朋友使用此方法。