美文网首页
Swift 5.x 协议和扩展

Swift 5.x 协议和扩展

作者: ShenYj | 来源:发表于2020-07-09 22:17 被阅读0次
  • 你可以扩展一个已经存在的类型来采纳和遵循一个新协议, 就算是你无法访问现有类型的源代码也行. 扩展可以添加新的属性、方法和下标到已经存在的类型, 并且因此允许你添加协议需要的任何需要.
protocol TextRepresentable {
    var textualDescription: String { get }
}

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






有条件的遵循协议
  • 泛型类型可能只在某些情况下满足一个协议的要求, 比如当类型的泛型形式参数遵循对应协议时. 你可以通过在扩展类型时列出限制让泛型类型有条件的遵循某协议. 在你采纳协议的名字后面写泛型where分句.
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






提供默认实现
  • 你可以使用协议扩展来给协议的任意方法或者计算属性要求提供默认实现. 如果遵循类型给这个协议的要求提供了它自己的实现, 那么它就会替代扩展中提供的默认实现.






相关文章

  • Swift 5.x 协议和扩展

    你可以扩展一个已经存在的类型来采纳和遵循一个新协议, 就算是你无法访问现有类型的源代码也行. 扩展可以添加新的属性...

  • Swift协议和扩展

    协议 与OC中一样,协议的关键字也是protocol在Swift中,class(类)、struct(结构体)、en...

  • swift —— 协议和扩展

    用 "protocol" 关键字来声明一个协议。例: 注:对于类如果方法中要修改 self;对于结构体,枚举,如果...

  • Swift:协议和扩展

    Protocols and Extensions github:Swift基础实例github:SwiftBasi...

  • Swift协议和扩展(四)

    1. 协议, 协议可以看成一个类的需求清单, 类可以声明它们拥有这些属性和方法. 协议看起来和类非常相似, 只是没...

  • Swift(九)协议和扩展

    更新:2018.05.24 整理了一下demo:SwiftDemo 扩展(Extension) Swift中,扩展...

  • Swift基础-协议和扩展

    协议 协议是描述某物必须具有的属性和方法的一种方式。然后,您可以告诉Swift哪些类型使用该协议-这一过程称为采用...

  • Swift的协议和扩展

    在扩展里添加协议遵循 你可以扩展一个已经存在的类型来采纳和遵循一个新的协议,就算是你无法访问现有类型的源代码也行。...

  • Swift 5.x 扩展 extension

    扩展为现有的类、结构体、枚举类型、或协议添加了新功能. 这也包括了为无法访问权限的源代码扩展类型的能力(即所谓的逆...

  • Swift3.0-协议和扩展

    用protocol 去声明协议。 一般情况下,值类型的实例方法不能修改它的属性。mutating(变异)加在方法前...

网友评论

      本文标题:Swift 5.x 协议和扩展

      本文链接:https://www.haomeiwen.com/subject/barecktx.html