Swift 5.x 协议和扩展

2020-07-09  本文已影响0人  ShenYj
protocol TextRepresentable {
    var textualDescription: String { get }
}

// 此处并无Dice这个类, 以及其sides属性
extension Dice: TextRepresentable {
    var textualDescription: String  {
        "A \(sides)- sided dice"
    }
}






有条件的遵循协议
protocol TextRepresentable {
    var textualDescription: String { get }
}
extension Array: TextRepresentable where Element: TextRepresentable {
    var textualDescription: String {
        let itemsAsText = self.map { $0.textualDescription }
        return "[" + itemsAsText.joined(separator: ",") + "]"
    }
}
extension Collection where Iterator.Element: TextRepresentable {
    var textualDescription: String {
        let itemsAsText = self.map { $0.textualDescription }
        return "[" + itemsAsText.joined(separator: ",") + "]"
    }
}






使用扩展声明采纳协议
protocol TextRepresentable {
    var textualDescription: String { get }
}

struct Hamster {
    var name: String
    var textualDescription: String {
        return "A hamster named \(name)"
    }
}
extension Hamster: TextRepresentable {}






协议扩展
struct LinearCongruentialGenerator: RandomNumberGenerator {
    func random() -> Double {
        return 8.0
    }
}

protocol RandomNumberGenerator {
    func random() -> Double
}

extension RandomNumberGenerator {
    func randomBool() -> Bool {
        return random() > 0.5
    }
}

let generator = LinearCongruentialGenerator()
print("Here's a random number: \(generator.random())")
print("And here's a random Boolean: \(generator.randomBool())")

输出结果:

Here's a random number: 8.0
And here's a random Boolean: true






提供默认实现






上一篇 下一篇

猜你喜欢

热点阅读