【Swift】泛型常见使用

1、Swift泛型4种

泛型函数
泛型类型
泛型协议
泛型约束

// 泛型函数定义式
func 函数名<泛型1,泛型2,…>(形参列表) -> 返回值类型 {
      // 函数体...
}


2、泛型约束3种

继承约束:泛型类型 必须 是某个类的子类类型
协议约束:泛型类型 必须 遵循某些协议
条件约束:泛型类型 必须 满足某种条件

// 继承约束使用格式
func 函数名<泛型: 继承父类>(参数列表) -> 返回值 {
      // 函数体,泛型类型是某个类的子类类型
}

// 协议约束使用格式
func 函数名<泛型: 协议>(参数列表) -> 返回值 {
      // 函数体,泛型类型遵循某些协议
}

// 条件约束使用格式
func 函数名<泛型1, 泛型2 where 条件>(参数列表) -> 返回值 {
      // 函数体,泛型类型满足某些条件
}


定义泛型协议

/// 1、定义泛型协议
protocol LFStackProtocol {
    // associatedtype:声明关联类型(占位符)
    associatedtype LFStack
    mutating func pushValue(value: LFStack)
    mutating func popValue() -> LFStack
}

/// 泛型协议 类型 条件约束
extension LFStackProtocol where LFStack == String {}


定义泛型类型

/// 2、泛型结构体
struct LFStack {
    // 泛型属性
    var stacks: [Element] = [Element]()
}

extension LFStack: LFStackProtocol {
    
    // typealias:设置关联类型
    typealias LFStack = Element
    
    mutating func pushValue(value: Element) {
        stacks.append(value)
    }
    
    mutating func popValue() -> Element {
        stacks.removeLast()
    }
    
}


泛型函数、泛型约束

extension LFStack {
    
    var topValue: Element? {
        return self.stacks.isEmpty ? nil : self.stacks[self.stacks.count - 1]
    }
    
    /// 3、泛型函数
    func changeValue(value1: inout Element, value2: inout Element) {
        let tempVale = value1
        value1 = value2
        value2 = tempVale
        debugPrint("value1 = \(value1) --- value2 = \(value2)")
    }
    
    /// 4、泛型 协议约束
    func findIndex(elements: [Element], element: Element) -> Int? {
        var index = 0
        for e in elements {
            // 因为遵循了Equatable协议,所以可以进行相等比较
            if e == element {
                return index
            } else {
                index += 1
            }
        }
        return nil
    }
    
}


泛型使用

class TestLFStack: NSObject {
    
    class func testLFStack() {

        var lfStack = LFStack()
        lfStack.pushValue(value: "haha")
        debugPrint("popValue = \(lfStack.popValue())")

        var value1 = 11
        var value2 = 12
        lfStack.changeValue(value1: &value1, value2: &value2)

    }
    
}

你可能感兴趣的:(【Swift】泛型常见使用)