Swift学习笔记-内嵌类型与不透明类型
Posted 宇仔TuT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift学习笔记-内嵌类型与不透明类型相关的知识,希望对你有一定的参考价值。
内嵌类型
内嵌类型的定义和使用
在一种类型中嵌套另一种类型,在其支持类型的大括号内定义即可。可以多级
嵌套多个类型。
例子,BlackjackCard
结构体内嵌两个枚举类型Suit
和 Rank
。
struct BlackjackCard
*// nested Suit enumeration*
enum Suit: Character
case spades = “♠”, hearts = “♡”, diamonds = “♢”, clubs = “♣”
*// nested Rank enumeration*
enum Rank: Int
case two = 2, three, four, five, six, seven, eight, nine, ten
case jack, queen, king, ace
struct Values
let first: Int, second: Int?
var values: Values
switch self
case .ace:
return Values(first: 1, second: 11)
case .jack, .queen, .king:
return Values(first: 10, second: nil)
default:
return Values(first: self.rawValue, second: nil)
*// BlackjackCard properties and methods*
let rank: Rank, suit: Suit
var description: String
var output = “suit is \\(suit.rawValue),”
output += “ value is \\(rank.values.first)”
if let second = rank.values.second
output += “ or \\(second)”
return output
引用内嵌类型
要在定义外部使用内嵌类型,只需在其前缀加上内嵌了它的类的类型名即可:
let heartsSymbol = BlackjackCard.Suit.hearts.rawValue
*// heartsSymbol is “♡”*
对于上面的栗子来说,可以使Suit
、 Rank
和 Values
的名字尽可能的短,因为它们的名字由定义时的上下文
自然限定。
个人理解:内嵌类型应该可以多级嵌套,使用链式语法访问这些类型。
不透明类型
关于不透明类型
不透明类型是swift5.1
新特性
- 不透明类型可以将函数的
返回类型
进行隐藏
。 - 不透明的
返回类型
将更加灵活。 - 不透明类型是
反泛型
。泛型
是调用者
知道具体哪个类型,但是不透明类型是模块的设计者
才知道具体是哪个类型。 - 不透明的返回类型要有
统一
的类型。
例子
struct Square: Shape
var size: Int
func draw() -> String
let line = String(repeating: "*", count: size)
let result = Array<String>(repeating: line, count: size)
return result.joined(separator: "\\n")
func makeTrapezoid() -> some Shape
let top = Triangle(size: 2)
let middle = Square(size: 2)
let bottom = FlippedShape(shape: top)
let trapezoid = JoinedShape(
top: top,
bottom: JoinedShape(top: middle, bottom: bottom)
)
return trapezoid
let trapezoid = makeTrapezoid()
print(trapezoid.draw())
可以看这个例子,这个例子返回了一个图形类型Shape
,但是没有暴露具体是什么类型的图形(三角形
、方形
、还是别的形状
)。
JoinedShape
是一个结构体,代码我没有抄出来,他的定义是这样的JoinedShape<T: Shape, U: Shape>
,作用是把两个图形垂直的拼成一个图形。
总结
- 作为函数返回值,
不透明类型
和协议
的区别- 不透明类型要求数据要有
统一性
,协议没有这个要求。这显得不透明类型更具有局限性
,协议更加灵活。 关联协议
不能用作函数的返回值
,但是不透明类型
却可以。- 不透明类型有时候能进行比较,更加强大。
- 不透明类型要求数据要有
- 和泛型区别
- 泛型往往用在一个
存储类型
代表可以存储多种
数据类型,或是用在函数的参数
,代表可以接收很多种数据类型。而不透明类型
是用在函数的返回值
。
- 泛型往往用在一个
Swift学习群
欢迎加入本人的Swift学习微信群,一同互相监督学习,我微信:reese90
以上是关于Swift学习笔记-内嵌类型与不透明类型的主要内容,如果未能解决你的问题,请参考以下文章
go语言学习笔记 — 基础 — 复合数据类型 — 结构体:类型内嵌与结构体内嵌(扩展和复用)