天天看點

16.Swift學習之結構體

結構體的介紹

  • 概念介紹
    • 結構體(struct)是由一系列具有相同類型或不同類型的資料構成的資料集合
    • 結構體是值類型
    • 結構體既可以定義屬性又可以定義方法

定義文法

struct 結構體名稱 {
    // 屬性和方法
}
           
  • 舉例
struct Person {
    var name = "Zhangsan"
    var age = 10
    var sex = "man"
    func say(){
        print("人會說話")
    }
}
           
  • 解讀
    • 定義了一個名叫 Person的結構體
    • 這個結構體擁有兩個存儲屬性 name、 age和 sex
    • 這個結構體擁有一個方法say

結構體執行個體

  • 執行個體化結構體最簡單的是在結構體名字後面寫上

    ()

    ,任何屬性都被初始化為它們的預設值
var p1 = Person()
           
  • 所有的結構體都有一個自動生成的

    成員構造函數

    來執行個體化結構體,可以使用它來初始化所有的成員屬性
var p2= Person(name: "Lisi", age: 20, sex: "woman")
           

通路屬性和方法

  • 可以用

    .

    來通路一個結構體執行個體的屬性和方法
  • 通路時如果使用了指派語句就是設定屬性
//通路
p2.age
//設定
p2.age = 30
           
//通過.調用結構體中的屬性和方法
p1.name
p1.age
p1.sex
p1.say()
           

  • 值類型是一種當它被指派給一個常量或者變量,或者被傳遞給函數時會被

    拷貝

    的類型
  • Swift 中的結構體(包括枚舉)是值類型,它在代碼傳遞中總是會被拷貝
//值類型拷貝
var p3 = p2
//此時改變p3并不會改變p2的值
p3.name = "Wangwu"
p3.age = 30

p2.age //20
p2.name //Lisi

p3.age //30
p3.name //Wangwu

           

常用的結構體

  • CGRect
/* Rectangles. */
public struct CGRect {
    public var origin: CGPoint
    public var size: CGSize
    public init()
    public init(origin: CGPoint, size: CGSize)
}
           
  • CGSize
/* Sizes. */
public struct CGSize {
    public var width: CGFloat
    public var height: CGFloat
    public init()
    public init(width: CGFloat, height: CGFloat)
}
           
  • CGPoint
/* Points. */
public struct CGPoint {
    public var x: CGFloat
    public var y: CGFloat
    public init()
    public init(x: CGFloat, y: CGFloat)
}
           

字元串,數組和字典的指派與拷貝行為

  • Swift 中的 String , Array 和 Dictionary類型是作為結構體來實作的,這意味着String , Array 和 Dictionary在它們被指派到一個新的常量或者變量,或它們本身被傳遞到一個函數或方法中的時候,其實是傳遞了拷貝。
  • OC中的 NSString, NSArray和 NSDictionary,它們是作為類來實作的,是以NSString , NSArray 和 NSDictionary執行個體總是作為一個引用而不是拷貝來指派和傳遞。