swift中不使用@objc的可选协议方法
在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
@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
}