Swift学习:泛型

2016-04-13  本文已影响64人  逸飞u

使用泛型的原因:

例如:

class Object {   }

class Stack1 {
    
    var items = [Object]()
    
    func push(item: Object) {
        items.append(item)
    }
    
    func pop() -> Object {
        return items.removeLast()
    }
}

但是,如果传值的时候需要考虑的问题很多,也影响性能(例子存在问题)

var s = Stack1()
s.push("abc")
s.push(182)
s.push(MyClass())

因此需要这样设置泛型

//泛型类型
class Stack<T> {
    
    var items = [T]()
    
    func push(item: T) {
        items.append(item)
    }
    
    func pop() -> T {
        return items.removeLast()
    }
}

//泛型函数
func swap<T>(inout first:T, inout second:T){
    let temp=first
    first=second
    second=temp
}

var data1=100.87
var data2=200.22
swap(&data1, &data2)

关联类型

swift 不支持泛型的协议,但可以这样实现
1.通过 associatedtype 在 protocol 里定义关联类型
2.实现协议时,可以将关联类型设置为泛型类型参数


protocol Container {
    associatedtype ItemType //关联类型
    
    func append(item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}

class Stack<T>: Container {
    
    typealias ItemType=T    
    var items = [T]()
    ...
    
    }
}

泛型约束

没有约束,泛型类型的功能就会很少

//泛型约束
func max<T:Comparable>(array: [T]) -> T {//Comparable是一个协议
    var value=array[0]
    
    for index in 1..<array.count
    {
        if array[index]>value {
            value=array[index]
        }
    }
    
    
    
    return value
}

多个约束

func max <T where T:Equatable ,T:Comparable>(array: [T]) -> T {}
上一篇 下一篇

猜你喜欢

热点阅读