美文网首页wsift
Swift中协议的关联类型

Swift中协议的关联类型

作者: ziyouzhe4 | 来源:发表于2017-05-11 16:42 被阅读158次

协议的关联类型指的是根据使用场景的变化,如果协议中某些属性存在“逻辑相同的而类型不同”的情况,可以使用关键字associatedtype来为这些属性的类型声明“关联类型”

protocol WeightCalcuAble {
    
    //为weight 属性定义的类型别名
    associatedtype WeightType
    
    var weight : WeightType {get}
    
}

WeightCalculable是一个“可称重”协议,weight属性返回遵守该协议具体类型的实例的重量。这里我们使用associatedtype为该属性的类型定义了一个别名WeightType,换言之在WeightCalculable中并不关心weight的类型是Int 还是Double或者是其他类型,他只是简单的告诉我们返回的类型是WeightType,至于WeightType到底是什么类型由遵守该协议的类中自己去定义。那么这样做的好处是什么呢?

//定义手机结构体
struct MobilePhone : WeightCalcuAble{
    
    typealias WeightType = Double
    var weight : WeightType
    
}
//定义汽车结构体
struct Car : WeightCalcuAble{
    
    typealias WeightType = Int
    var weight: WeightType
    
}

let phone = MobilePhone(weight: 0.24)
let car = Car(weight: 1000)

MobilePhone、Car类型都遵守了WeightCalculable协议,都能被称重,但是手机由于结构精密、体型小巧,小数点后面的数字对于称重来说是必不可少的,所以使用了Double类型,返回0.138千克即138克,但是对于汽车这样的庞然大物在称重时如果还计较小数点后面的数字就显得没有意义了,所以使用Int类型,表示3000千克也就是3吨。

从上面的例子可以很好的看出由于MobilePhone、Car称重时逻辑是一样的,但是对于weight属性的返回值要求不一样,如果仅仅因为返回值类型的不同定义两个类似的协议一个是Int类型另外一个是Double类型,这样做显然是重复的、不合适的。所以associatedtype在这种情况下就发挥出作用了,他让开发者在遵守协议时根据需求去定义返回值的类型,而不是在协议中写死。唯一要注意的是:一定要在遵守该协议的类型中使用typealias规定具体的类型。不然编译器就报错了。

相关文章

  • 2018-03-08

    Swift关键字 associatedtype: 协议-关联类型, 作用:为协议中的某个类型提供了一个占位名(或者...

  • Swift中协议的关联类型

    协议的关联类型指的是根据使用场景的变化,如果协议中某些属性存在“逻辑相同的而类型不同”的情况,可以使用关键字ass...

  • Swift 协议关联类型和约束的理解

    协议 (Protocol) 是 Swift 语言中非常强大而灵活的一个特性。而其中的关联类型就是 Swift 协议...

  • Swift:协议中关联类型参数可读

    原文链接原文日期:2016-04-09译者:Crystal Sun 我慢慢习惯了 Swift 里的 Associa...

  • swift 关联类型

    关联类型 定义一个协议时,声明一个或多个关联类型作为协议定义的一部分将会非常有用。关联类型为协议中的某个类型提供了...

  • iOS中Swift从开始入门到最后的放弃(十),

    # Swift方法 在 Swift 中特定类型的相关联功能被称为方法。在 Objective C 中类是用来定义方...

  • Swift 处理异常

    处理方式 定义异常类型 在 Swift 中,错误用符合Error协议的类型的值来表示。这个空协议表明该类型可以用于...

  • Swift 关键字 -- associatedtype

    associatedtype 关联类型的关键字,处理 协议 中的范型使用场景 实现 Stack 协议 错误例子: ...

  • swift之Protocol

    协议(Protocol) swift中协议用于定义多个类型应该遵守的规范。协议定义规范,类是协议的一种具体实现,协...

  • Swift面向协议编程

    简介 面向协议编程的思想在swift中处处可见,比如swift常用的数据类型String, Array, Dict...

网友评论

  • 83fbea52fbe9:这样的话 看起来跟直接在MobilePhone和Car里定义不同类型的weight属性差不多嘛?

本文标题:Swift中协议的关联类型

本文链接:https://www.haomeiwen.com/subject/jfootxtx.html