如何在Struct中实现协议可选方法?

时间:2018-01-18 14:30:37

标签: swift struct protocols swift4

我在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协议,它的工作完全正常。

任何帮助将不胜感激。谢谢

2 个答案:

答案 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成为一个类。