我已经把以下内容放进了游乐场来尝试理解这一点,但我只是没有:
import Foundation
@objc protocol Sample {
var value: Int { get set }
func increase()
func decrese()
}
extension Sample {
func increase() {
value += 1
}
func decrease() {
value -= 1
}
}
class Test: Sample {
var value: Int = 0
}
该错误出现在Test
的class
声明旁边,内容如下:
非"@objc"方法"增加(("不满足"@objc"协议"样本"的要求
如果我在课堂上重新声明increase()
和decrease()
,则警告将被静音。或者如果我从协议中删除声明。有人可以解释一下吗?
编辑
我确实需要一个 Objective-C 类来符合这个协议,因此一开始就@objc
。
问题是你在协议扩展中定义这些方法。这用于定义协议的"默认实现"(即,如果类型未实现该方法,则将调用协议的实现(。
但是Objective-C没有协议默认实现的概念。因此,将协议声明为@objc
并在 Swift 协议扩展中具有默认实现是没有意义的。符合此协议的 Objective-C 类将永远无法享受这些 Swift 默认实现。
下面的代码适用于协议扩展类中的空协议方法的实现
import Foundation
protocol Sample {
var value: Int { get set }
func increase()
func decrease()
}
extension Sample {
func increase() { }
func decrease() { }
}
class Test: Sample {
var value: Int = 0
}
或者,如果您希望在扩展中实现Sample
协议方法的一些默认实现,请使用
import Foundation
protocol Sample {
var value: Int { get set }
func increase()
mutating func decrease()
}
extension Sample {
func increase() {
print("do anything")
}
mutating func decrease() {
value -= 1
}
}
class Test: Sample {
var value: Int = 0
}
mutating
是在协议方法decrease()
之前添加的,因为它修改了协议变量value
。 如果协议扩展不修改任何协议变量(例如increase()
(,则不需要mutating
关键字