Swift之旅(六)协议与扩展

前端之家收集整理的这篇文章主要介绍了Swift之旅(六)协议与扩展前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

使用 protocol 来定义一个协议。

protocol ExampleProtocol {
    var simpleDescription: String { get }
    mutating func adjust()
}

类、枚举和结构体都可以接受协议。

class SimpleClass: ExampleProtocol {
    var simpleDescription: String = "A very simple class."
    var anotherProperty: Int = 69105
    func adjust() {
        simpleDescription += " Now 100% adjusted."
    }
}
var a = SimpleClass()
a.adjust()
let aDescription = a.simpleDescription

struct SimpleStructure: ExampleProtocol {
    var simpleDescription: String = "A simple structure"
    mutating func adjust() {
        simpleDescription += " (adjusted)"
    }
}
var b = SimpleStructure()
b.adjust()
let bDescription = b.simpleDescription

试一试

写一个遵循该协议的枚举。

注意SimpleStructure里使用了 mutating 关键字标记了一个修改结构体的方法。SimpleClass的定义里不需要任何方法标记为mutating,因为类中的方法总是会修改这个类的。

使用 extension 来为已经存在的类增加功能,比如新方法和计算过的属性。你可以用 extension 给那些定义在别的地方的类型增加协议遵循,甚至可以加到导入的类库或者框架的类型中。

extension Int: ExampleProtocol {
    var simpleDescription: String {
        return "The number \(self)"
    }
    mutating func adjust() {
        self += 42
    }
}
println(7.simpleDescription)

试一试

为Double类型写一个扩展,增加一个 absoluteValue 属性

你可以像其它任何命名类型那样使用协议名——例如,要创建一个对象集合,对象的类型都不一样,不过都遵循一个单独的协议。当遇到类型为协议类型的值时,协议定义以外的方法是不可用的。

let protocolValue: ExampleProtocol = a
println(protocolValue.simpleDescription)
// println(protocolValue.anotherProperty) // 取消注释看看会有什么错误

即使变量 protocolValue 运行时类型是 SimpleClass,编译器还是把它当作给定的 ExampleProtocol 类型。这说明除了协议里定义的,你没法访问到类实现的方法属性

原文链接:https://www.f2er.com/swift/327192.html

猜你在找的Swift相关文章