我在Movable Protocol中定义了可选方法
@objc protocol Movable
{
@objc optional func move(to point: CGPoint)
}
现在,我正在尝试继承相同的协议和结构,但编译器抱怨下面给定的行。
错误:非类型'形状'不符合课程协议' Movable'
struct Shape: Movable
{
func drawShape(){
print("DrawShapped Called")
}
func move(to point: CGPoint) {
print("Struct Movable called")
}
}
而且,如果我在某个类而不是struct中继承Movable协议,它的工作完全正常。
任何帮助将不胜感激。谢谢
答案 0 :(得分:3)
将协议标记为@objc
时。您隐式将该协议标记为class
协议。也就是说,它必须由一个类来实现。因为在objective-c中,结构不能实现协议
尝试将其更改为
class Shape: Movable
{
func drawShape() {
print("DrawShapped Called")
}
func move(to point: CGPoint) {
print("Struct Movable called")
}
}
或标记不要将Movable
标记为@objc
答案 1 :(得分:3)
正如Swift Rabbit在评论中指出的那样,更好的解决方案是默认实现:
protocol Movable {
func move(to point: CGPoint)
}
extension Movable {
func move(to point: CGPoint) {} // Do nothing by default
}
除非您需要与ObjC代码进行交互,否则应避免向事物添加@objc
。如果此协议必须与ObjC代码交互,那么您不能使用结构符合它,并且您需要使Shape
成为一个类。