Swift - 关键字associatedtype

associatedtype:关联类型,定义一个协议时,有的时候声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了一个占位名(或者说别名),其代表的实际类型在协议被采纳时才会被指定。你可以通过 associatedtype 关键字来指定关联类型。

协议中不支持泛型,如果在协议中需要达到泛型这种类似的效果
我们可以使用 associatedtype 关键字。

//模型
class Animal {
    var name: String?
    var age : Int = 0
}

class Dog: Animal {
    var color: String?
}

class Cat: Animal {
    
    var action:String?
}

//定义一个协议
protocol AnimalProtocol {
    //定义一个关联类型
    associatedtype T;
    
    func append(_ item: T)
}

class Person: AnimalProtocol {
    //在使用协议时需要明确指定协议中的关联类型
    typealias T = Dog;
    
    func append(_ item: Dog) {
        print("添加一只狗")
    }
    
}

class Student: AnimalProtocol {
    //在使用协议时需要明确指定协议中的关联类型
    typealias T = Cat
    
    func append(_ item: Cat) {
        print("添加一只猫")
    }
}

其实我们还可以对协议中定义的 T(泛型)指定具体的类型,或则添加相应的约束来限制类型:

protocol DogProtocol {
    associatedtype T : Dog
    
    func append(_ item: T)
}

协议类型作为返回值:

protocol TestProtocol {
    associatedtype service
    func creatService() -> service
}

protocol TestProtocol2 {
    
    func creatService()
}

protocol TestProtocol3 {
    func testMethod()
}

class TestClass2: TestProtocol2 {
    func creatService() {
        
    }
}

class TestClass3: TestProtocol3 {
    func testMethod() {
        
    }
}

class Test: TestProtocol {
    typealias service = TestProtocol2
    func creatService() -> service {
        return TestClass2.init() // 协议作为返回值, 我们可以返回一个遵守该协议的实例对象
    }
}

class Test1: TestProtocol {
    typealias service = TestProtocol3
    
    func creatService() -> service {
        return TestClass3.init()// 协议作为返回值, 我们可以返回一个遵守该协议的实例对象
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • associatedtype 关联类型的关键字,处理 协议 中的范型使用场景 实现 Stack 协议 错误例子: ...
    呵呵_7380阅读 1,001评论 0 3
  • 一、简介 关键字 指swift已经使用的字段,如let var等。特性 通过在@符号后跟一个特性名称与参数,来声明...
    想聽丿伱說衹愛我阅读 347评论 0 1
  • 有句话之前我提过,今天还想再说一次。那就是打铁还需自身硬。对于自身能力的严格要求,可以帮助实现我们所有梦寐以求的东...
    苹果上的小豌豆阅读 2,198评论 0 7
  • 作者:Jordan Morgan,原文链接,原文日期:2017-02-11 译者:郑一一;校对:numbbbbb,...
    iOS亮子阅读 658评论 0 1
  • 常见的Swift关键字 let - 定义常量,不可变,如果对let定义的常量重新赋值会报错,并提供Fix-it,变...
    Mr__Peng__阅读 410评论 0 1