Swift- 泛型

系统泛型

例如:NSDictionary,NSArray

Dictionary<String,Int>()
Array<Int>()

泛型函数

func fanTest<T>(value:T)->T{
    
    print(value)
    return value
}
fanTest(value: "1")

类型参数

始终使用大写字母开头的驼峰命名法(例如 T 和 MyTypeParameter)来为类型参数命名,以表明它们是占位类型,而不是一个值。

//类型参数
func fanTest_2<T,U>(value:T,value2:U)->T{
    
    print(value)
    return value
}
fanTest_2(value: "1", value2: 1)

泛型类型

自定义类、结构体和枚举可以适用于任何类型,类似于 Array 和 Dictionary

//泛型类型(自定义类、结构体和枚举)
struct Stack<Element> {
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

扩展一个泛型类型

extension Stack{
    
    var name:Element?{
        
        return nil
    }
}

类型约束

类型参数名后面放置一个类名或者协议名

func someFunction<T: SomeClass, U: SomeProtocol>(someT: T, someU: U) {
    // 这里是泛型函数的函数体部分
}

关联类型

关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。

protocol Container {
    associatedtype ItemType
    mutating func append(_ item: ItemType)
    var count: Int { get }
    subscript(i: Int) -> ItemType { get }
}


struct testAAA:Container{
    typealias ItemType = Int   //协议实现的时候去定义类型
    internal subscript(i: Int) -> Int {
        return 1
    }
    var count: Int = 2
    mutating func append(_ item: ItemType){
    }
    
}

扩展一个已存在的类型来指定关联类型


extension Array: Container {}

泛型 Where 语句

func allItemsMatch<C1: Container, C2: Container>
    (_ someContainer: C1, _ anotherContainer: C2) -> Bool
    where C1.ItemType == C2.ItemType, C1.ItemType: Equatable {
        
        // 检查两个容器含有相同数量的元素
        if someContainer.count != anotherContainer.count {
            return false
        }
        
        // 检查每一对元素是否相等
        for i in 0..<someContainer.count {
            if someContainer[i] != anotherContainer[i] {
                return false
            }
        }
        // 所有元素都匹配,返回 true
        return true
}

func testBBB<T>(value:T) where T:Equatable {
    
    
}

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

推荐阅读更多精彩内容

  • 泛型代码可以确保你写出灵活的,可重用的函数和定义出任何你所确定好的需求的类型。你的可以写出避免重复的代码,并且用一...
    iOS_Developer阅读 4,189评论 0 0
  • 本文转载自http://blog.csdn.net/youshaoduo/article/details/5486...
    desunire阅读 5,908评论 0 0
  • 泛型: 泛型是一种类型的占位符,具体的类型将会在之后被填充。由于Swift的严格类型检验,这是很有用的。在不能或者...
    小松树先生阅读 3,989评论 0 3
  • 原文:Generics Manifesto -- Douglas Gregor 译者注 在我慢慢地深入使用 Swi...
    kemchenj阅读 6,655评论 0 6
  • Swift 提供了泛型让你写出灵活且可重用的函数和类型。Swift 标准库是通过泛型代码构建出来的。Swift 的...
    零度_不结冰阅读 3,047评论 0 0