通过观看Apple提供的视频教程,似乎swift是面向协议的编程语言,并且Apple鼓励程序员使用协议而不是类。
但从我个人的角度来看,我认为协议没有明显的优势。类可以符合协议,但也可以从超类继承。我们可以向协议添加扩展,但我们也可以向类添加扩展。我们可以在符合协议的类中实现函数,但我们也可以在子类中重写 func 。
我仍然很困惑为什么我们需要使用协议而不是类。什么时候我们应该使用协议而不是类?
类和协议是正交的概念。协议跨越类树并将具有不同祖先的一个或多个类连接起来。
也许更简单地说:
- “类”定义了对象是什么。
- “协议”定义了对象具有的行为。
所以你有一个类 Car:
class Car {
var bodyStyle : String
}
和一类颜色:
class Color {
var red : Int
var green : Int
var blue : Int
}
现在,或多或少明显颜色和汽车完全无关,但是,假设我希望能够轻松地将其中任何一个转换为字符串,这样我就可以使用以下命令进行调试:
print(Car(...))
or
print(Color(...))
正是为了这个目的,Swift 语言定义了协议CustomStringConvertible
所以我们可以声明可以使用该协议打印 Car:
extension Car : CustomStringConvertible {
var description : String { get { return "Car: \(bodyStyle)" } }
}
还有颜色:
extension Color : CustomStringConvertible {
var description : String { get { return "Color: \(red) \(green) \(blue)" } }
}
因此,以前我需要为每个类使用一种打印方法,现在我只需要一种打印方法,如下所示:
func print(data:CustomStringConvertible) {
let string = data.description
... bunch of code to actually print the line
}
这是可能的,因为声明一个类实现一个协议是一个承诺,我可以使用协议中的方法,知道它们已实现并且(大概)执行预期的操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)