Alex Liang

Swift Value and Reference Types

初次接觸Swift時,少了pointer的機制,讓人好奇過去function call的call by value, call by reference是否有所不同
而Swift除了class外,其餘資料型態皆為value type。
這篇文章整理Swift Value and Reference type的差異

Value Type

當copy value type資料時,Swift其實是創造一份獨立的”拷貝”,任何改變原本變數的值不會影響拷貝的資料

1
2
3
4
5
struct Person { var name: String = "Alex" }
let somePerson = Person()
let otherPerson = somePerson
somePerson = "John"
print("\(somePerson.name), \(otherPerson.name)) // print John, Alex

當somePerson的name被改變時,otherPerson並不受影響

Reference Type

當copy reference type資料時,Swift只是增加一個reference指向原本的資料

1
2
3
4
5
class Person { var name: String = "Alex" }
let somePerson = Person()
let otherPerson = somePerson
somePerson = "John"
print("\(somePerson.name), \(otherPerson.name)) // print Alex, Alex

由以上例子可知,在使用function時要注意是否需要改變傳入的值
因為大多數的資料型態為value type,傳入function後無法修改原本的值
在multi-thread的環境中,這也一定確保資料的完整性,降低debug的困難度

如何選擇?

使用value type:

  1. 比較拷貝的資料(==)是合理行為
  2. 拷貝的複本有獨立的狀態
  3. 資料可能會被多個執行緒使用

使用reference type:

  1. 比較拷貝的識別(===)是合理的行為
  2. 想創造可共享和改變的狀態

參考來源:
Apple官方文件