Dav*_*rry 13
类和协议是正交概念.协议跨越类树并且使用不同的祖先连接一个或多个类.
也许更简单地说:
所以你有一个班车:
class Car {
var bodyStyle : String
}
Run Code Online (Sandbox Code Playgroud)
和一个颜色:
class Color {
var red : Int
var green : Int
var blue : Int
}
Run Code Online (Sandbox Code Playgroud)
现在,或多或少显然颜色和汽车完全不相关,但是,假设我希望能够轻松地将其中一个转换为字符串,所以我可以调试:
print(Car(...))
Run Code Online (Sandbox Code Playgroud)
要么
print(Color(...))
Run Code Online (Sandbox Code Playgroud)
为了这个目的,Swift语言定义了协议,CustomStringConvertible因此我们可以声明可以使用该协议打印Car:
extension Car : CustomStringConvertible {
var description : String { get { return "Car: \(bodyStyle)" } }
}
Run Code Online (Sandbox Code Playgroud)
还有一个颜色:
extension Color : CustomStringConvertible {
var description : String { get { return "Color: \(red) \(green) \(blue)" } }
}
Run Code Online (Sandbox Code Playgroud)
所以在我需要为每个类创建一个打印方法之前,现在我只需要一个看起来像这样的打印方法:
func print(data:CustomStringConvertible) {
let string = data.description
... bunch of code to actually print the line
}
Run Code Online (Sandbox Code Playgroud)
这是可能的,因为声明一个类实现一个协议是一个承诺,我可以使用协议中的方法,知道它们已经实现并且(可能)做了预期的事情.
小智 9
让我们来看一个下载示例.
您有一个基类FileDownloadModel,并有3个子类AudioFileDownloadModel,VideoFileDownloadModel和ImageDownloadModel.
你有一个DownloadManager,它接受FileDownloadModel输入并使用这个模型的urlToDownload属性来下载文件.
后来下了线,你被告知还有一个模式来,但它的类型UserDownloadModel这是一个子类的用户,而不是FileDownloadModel.
现在看,很难处理这种情况,你必须更改大量代码以合并下载方法.
面向协议的编程如何帮助您:
| 归档时间: |
|
| 查看次数: |
3985 次 |
| 最近记录: |