swift泛型约束

作者: gerrywanggang | 来源:发表于2021-09-20 13:22 被阅读0次

泛型在实际应用中往往要给泛型添加约束。
简单举一个例子:

class Human<T, U>: Codable where T: Codable, U: Codable {
    var name: T
    var age: U
    
    init(name: T, age: U) {
        self.name = name
        self.age = age
    }
}

在上面的代码中where T: Codable, U: Codable就是给泛型添加约束。加上约束之后,在创建Human的实例的时候name和age必须满足Codable协议

泛型约束的添加时机,可以在类/结构/协议定义的时候的添加,也可以在其extension中添加。在extension中添加将更加灵活。
在class扩展中添加泛型约束

class SwitchSkin<BASE> {
    var base: BASE
    init(_ base: BASE) {
        self.base = base
    }
}

extension SwitchSkin where BASE : UIView {
    func setSkinBackground(color: UIColor) {
        base.backgroundColor = color
    }
}

在协议扩展中添加泛型约束

protocol SwitchSkinCompatiale {
    associatedtype OBJ
    var ss: SwitchSkin<OBJ> { get }
}

extension SwitchSkinCompatiale where OBJ: NSObject {
    func sayHello() {
        print("Hello World!")
    }
}

在协议中使用泛型时,扩展中直接使用Self, 这个方式非常灵活。相当于直接自动指定为泛型为自身的类型。

final class SwitchSkin<BASE> {
    var base: BASE
    init(_ base: BASE) {
        self.base = base
    }
}

extension SwitchSkin where BASE : UITextField {
    func setSkinBackground(color: UIColor) {
        base.backgroundColor = color
    }
    
    func setText(text: String) {
        base.text = text
        print(base.text ?? "")
    }
}

protocol SwitchSkinCompatible {
    associatedtype T
    var ss: SwitchSkin<T> { get }
}

extension SwitchSkinCompatible {
    var ss: SwitchSkin<Self> {
        return SwitchSkin.init(self)
    }
}

extension NSObject: SwitchSkinCompatible {}

UITextField.init().ss.setText(text: "123")

输出为
123

不同的泛型可以通过约束条件建立关联,如函数和类中的泛型。如下

class Human<T, U>: Codable where T: Codable, U: Codable {
    var name: T
    var age: U

    init(name: T, age: U) {
        self.name = name
        self.age = age
    }

    func sameNameTypeSuperman<S: SupermanType>(superman: S) -> S where S.NAMETYPE == T {
        return Superman.init(name: name) as! S
    }
}

protocol SupermanType {
    associatedtype NAMETYPE
}

struct Superman<NAMETYPE>: SupermanType {
    var name: NAMETYPE
}

let human = Human.init(name: "xiaoli", age: 18)
let s = human.sameNameTypeSuperman(superman: Superman.init(name: "super xiao li"))
print(s)

上面的例子中,sameNameTypeSuperman函数中,SupermanType协议中的NAMETYPE和Human类中的name的泛型T建立了约束。

总结, 泛型约束用在了下列一些地方:

  1. 泛型定义的地方,直接加上约束;
  2. extension的时候,通过泛型约束建立条件扩展;
  3. 不同的泛型定义之间建立约束条件,如函数中的泛型和类中的泛型。

相关文章

  • 【Swift】泛型常见使用

    1、Swift泛型4种 泛型函数泛型类型泛型协议泛型约束 2、泛型约束3种 继承约束:泛型类型 必须 是某个类的子...

  • Swift中的那些泛型约束

    协议泛型约束 将listView的类型约束在了UIScrollView及其子类 Swift2.3方法泛型约束 将l...

  • swift泛型整理

    swift泛型知识主要包括:泛型函数、泛型协议、泛型类型、泛型约束。 一、泛型函数。 如:一个交换两个变量值的函数...

  • swift泛型约束

    查找某个数组中的元素下标(这里使用最笨的循环查找) 泛型约束

  • swift泛型约束

    泛型在实际应用中往往要给泛型添加约束。简单举一个例子: 在上面的代码中where T: Codable, U: C...

  • 泛型

    Swift 泛型 泛型主要用于解决代码的抽象能力 + 代码的复用性 例如下面的例子,其中的T就是泛型 类型约束 在...

  • swift语法 for (index, value) in ar

    本节内容摘自SwiftGG-泛型-类型约束实践[https://swiftgg.gitbook.io/swift/...

  • 19.泛型和泛型约束(generics,genericConst

    泛型和泛型约束

  • Kotlin泛型方法

    泛型约束 泛型通配符

  • Swift 泛型

    泛型函数 泛型类型 泛型约束

网友评论

    本文标题:swift泛型约束

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