非"@objc"方法不满足"@objc"协议的要求



我已经把以下内容放进了游乐场来尝试理解这一点,但我只是没有:

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
}

该错误出现在Testclass声明旁边,内容如下:

非"@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关键字

最新更新