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

3

我将以下内容放入Playground中进行理解,但是我并不明白:

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类声明旁边,提示如下:

非 '@objc' 方法 'increase()' 无法满足 '@objc' 协议 'Sample' 的要求

如果我在类中重新声明 increase()decrease(),则警告会消失。或者也可以从协议中删除这些声明。请问有人能够解释一下吗? 编辑 我确实需要一个 Objective-C 类来符合此协议,因此在开头使用了 @objc

你只为Swift范围提供默认实现。由于你的协议是@objc,所以你的Test类看不到默认实现。 - undefined
由于您使用了@-objc,当您实现一个协议时,您需要在符合该协议的类中实现其方法。此外,您可能希望对那些您不想在类中实现的方法使用@objc optional。 - undefined
这个回答解决了你的问题吗?如何在Swift协议中定义可选方法? - undefined
2个回答

5
问题在于你正在协议扩展中定义这些方法。这是用于为协议定义“默认实现”的(即,如果类型没有实现该方法,则会调用协议的实现)。
但是Objective-C没有协议的默认实现的概念。因此,声明协议为@objc并在Swift协议扩展中具有默认实现是没有意义的。符合此协议的Objective-C类将永远无法享受这些Swift的默认实现。

请查看 https://dev59.com/XFkS5IYBdhLWcg3ww49d - undefined

0
以下代码与协议扩展类中的空协议方法实现一起使用。
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 关键字。


当协议没有声明@objc时,它可以正常工作,但正如我所说,我需要它可以访问ObjC。@Rob是正确的。ObjC对协议扩展一无所知,因此需要重新声明实现。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接