# Swift 泛型

369 阅读2分钟

Swift 泛型

概念

泛型把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特殊的类型。 泛型概念最早出自C++模版,Swift 泛型和 C++ 模版设计思路是一致的。为什么不和Java一致呢? 因为Swift 是编译时运行的多态的技术,Java是运行时多态的技术。 优点: 因为在编译时就确定了类型,所以运行时不需要额外计算,效率比较高。也可以使代码更加安全。 缺点:生成的二进制包比较大。

泛型使用

常规的传值

// 泛型例子1 字符串数组
// strList 字符串数组
func showFangXingStringList(strList: [String]) {
    print("字符串数组 = \(strList)")
}

// 泛型例子2 数字数组
// numList 数字数组
func showFangXingNumList(numList: [Int]) {
    print("数字数组 = \(numList)")
}

使用

showFangXingNumList(numList: [1,2,3])
showFangXingStringList(strList: ["你","我","他"])

打印

数字数组 = [1, 2, 3]
字符串数组 = ["你", "我", "他"]

泛型使用

// 泛型例子3 泛型数组
// T 泛型数组
func showFangXingTList<T>(tList: [T]) {
    print("泛型数组 = \(tList)")
}

使用

showFangXingTList(tList: [1,2,3])
showFangXingTList(tList: ["你","我","他"])

打印

泛型数组 = [1, 2, 3]
泛型数组 = ["你", "我", "他"]

关联类使用

Swift 中使用 associatedtype 关键字来设置关联类型实例。 定义了一个 ZStateType 协议,该协议定义了一个关联类型 StateType。 关联类的使用

// ZStateType 协议
protocol ZStateType {
    // Swift 中使用 associatedtype 关键字来设置关联类型实例
    associatedtype StateType
    
    func demo(item: StateType)
}

// 非泛型 使用
struct StatesInt: ZStateType {
    typealias StateType = Int
    func demo(item: Int) {
        print("关联类Int = \(item)")
    }
}

// 泛型 使用
struct StatesT<T>: ZStateType {
    func demo(item: T) {
        print("关联类T = \(item)")
    }
}

使用

let sInt = StatesInt()
sInt.demo(item: 1)
    
let sT = StatesT<String>()
sT.demo(item: "good")

打印

关联类Int = 1
关联类T = good

Where 语句使用

where语句定义参数的约束 下面例子判断两个ZStateType类型必须相等

例子

func ZStateTypeWhere<t1: ZStateType, t2: ZStateType>(z1: t1, z2: t2) where t1.StateType == t2.StateType  {
    
}

使用

let sT1 = StatesT<String>()
let sT2 = StatesT<Int>()

// 类型不相同错误: Global function 'ZStateTypeWhere(z1:z2:)' requires the types 'StatesInt.StateType' (aka 'Int') and 'String' be equivalent
// ZStateTypeWhere(z1: sT1, z2: sT2)


ZStateTypeWhere(z1: sT1, z2: sT1)

泛型和Any

泛型和Any看起来很类似,但是还是有些不同的。

Any会躲避类型的检查,不安全。尽量少用 泛型不会躲避检查,安全

例子

// MARK: 泛型和Any
func showGeneric<T>(n: T) {
    print("n = \(n)")
}

func showAny(n: Any) {
    print("n = \(n)")
}

使用

showGeneric(n: 1)
showAny(n: 1)

打印

n = 1
n = 1