Swift学习笔记-内嵌类型与不透明类型

Posted 宇仔TuT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Swift学习笔记-内嵌类型与不透明类型相关的知识,希望对你有一定的参考价值。

内嵌类型

内嵌类型的定义和使用

在一种类型中嵌套另一种类型,在其支持类型的大括号内定义即可。可以多级嵌套多个类型。
例子,BlackjackCard 结构体内嵌两个枚举类型SuitRank

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 “♡”*

对于上面的栗子来说,可以使SuitRankValues 的名字尽可能的短,因为它们的名字由定义时的上下文自然限定。

个人理解:内嵌类型应该可以多级嵌套,使用链式语法访问这些类型。

不透明类型

关于不透明类型

不透明类型是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>,作用是把两个图形垂直的拼成一个图形。

总结

  1. 作为函数返回值,不透明类型协议的区别
    • 不透明类型要求数据要有统一性,协议没有这个要求。这显得不透明类型更具有局限性,协议更加灵活。
    • 关联协议不能用作函数的返回值,但是不透明类型却可以。
    • 不透明类型有时候能进行比较,更加强大。
  2. 和泛型区别
    • 泛型往往用在一个存储类型代表可以存储多种数据类型,或是用在函数的参数,代表可以接收很多种数据类型。而不透明类型是用在函数的返回值

Swift学习群

欢迎加入本人的Swift学习微信群,一同互相监督学习,我微信:reese90

以上是关于Swift学习笔记-内嵌类型与不透明类型的主要内容,如果未能解决你的问题,请参考以下文章

go语言学习笔记 — 基础 — 复合数据类型 — 结构体:类型内嵌与结构体内嵌(扩展和复用)

Swift:返回运行时随机不透明类型会产生错误

《从零开始学Swift》学习笔记(Day 11)——数据类型那些事儿?

Swift学习笔记-类型转换

Swift学习笔记-类型转换

Java:Effective java学习笔记之 列表优先于数组