Swift学习:泛型

使用泛型的原因:

例如:

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 {}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 泛型的概念 泛型代码可根据自定义需求,写出适用于任何类型、灵活且可重用的函数和类型,避免重复的代码,用一种清晰和抽...
    伯wen阅读 408评论 0 2
  • 136.泛型 泛型代码让你可以写出灵活,可重用的函数和类型,它们可以使用任何类型,受你定义的需求的约束。你可以写出...
    无沣阅读 1,508评论 0 4
  • 泛型泛型的本质是参数化类型,也就是说所有操作的数据类型被制定为一个参数,这种参数类型可以用在类型、函数和方法中。 ...
    CN_HarrySun阅读 344评论 0 0
  • 泛型(Generics) 泛型代码允许你定义适用于任何类型的,符合你设置的要求的,灵活且可重用的 函数和类型。泛型...
    果啤阅读 688评论 0 0
  • 的发个史蒂夫和史蒂芬好的发个史蒂夫和史蒂芬好
    竹青小佳阅读 431评论 0 1