@objc protocol Transaction {
func commit() -> Bool
optional func isComplete() -> Bool
}
以上协议被标示为@objc属性,使得它兼容Objective-c代码.如果协议拥有可选的协议或属性的话这是必须的,因为Swift要使用Objective-C运行时去检查类所遵守的可选方法是否存在.
不幸的是,这意味着拥有可选方法的协议只能被类遵守;结构和枚举不可以遵守包括可选方法的协议.
协议一般并不包括可选方法或属性,因为他们被设计去描述类的严格接口.不管如何,可选方法和属性偶尔也可以变得有用,它们存在于Cocoa和Cocoa Touch框架中,所以即使你不在自己代码中使用它们,你也可能在一些地方碰到它们 ;]
可选协议方法直到Objc 2.0之前都是不可用的.可选方法多被定义在方法中联合委托一起使用.
在Objc 2.0 之前,委托一般被定义为id类型,并且你需要阅读它们的文档才可以搞清楚它们期待被实现的方法.况且,使用这些委托的类必须检查它们委托看看到底有木有实现特定的方法.没有办法告诉编译器给定的方法在一个委托类中是否需要被实现.
随着Objc2.0被引入后,委托类现在可以使用协议来定义类型.不管怎样,使用委托的类常常拥有需要和可选实现的方法(有时只有可选方法).
可选方法是用于增强和扩展委托功能的一种方式,Objc 2.0给协议增加了可选方法,允许委托遵循一个协议,因此使得与委托相关的编程变得些许容易了 ;]