初次接觸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
5struct 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
5class 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:
- 比較拷貝的資料(==)是合理行為
- 拷貝的複本有獨立的狀態
- 資料可能會被多個執行緒使用
使用reference type:
- 比較拷貝的識別(===)是合理的行為
- 想創造可共享和改變的狀態
參考來源:
Apple官方文件