Swift的數據類型有:
- 整型,Int
- 浮點型,Float
- 布爾??型, Bool
- 字符串,String
- 元組,Tuple
- 集合(數組,字典)
- 枚舉
- 結構體
- 類
按照參數傳遞方式的不同,可以分為「值類型」和「引用類型」。
值類型?就是在賦值或給函數傳遞參數的時候,創建一個副本,把副本傳遞過去,這樣在函數調用過程中不會影響到原始數據。
引用類型?在傳遞參數的過程中,是把數據本身傳遞過去,這樣在函數調用過程中會影響原始數據。
我們看下面的例子:
var str = "Hello, playground"
var str1 = str
print("str: \(str), str1: \(str1)")
str = "hello, world"
print("str: \(str), str1: \(str1)")
//: Out: "str: hello, world, str1: Hello, playground\n"
//: 原對象的值作了修改,但新的第二個對象的值并沒有受到影響,在對str1賦值的時候,也只是將str作了一個副本,然后再將這個副本給了str1。
//: ## 引用類型
//: 對于類來說,由于類在Swift中是引用類型,在傳遞參數的時候,就是數據本身傳遞給新的變量的,因而新舊變量的值都會產生相應的變化。
class StringA {
var str = "hello, world"
}
var strA = StringA()
var strB = strA
print("strA: \(strA.str), strB: \(strB.str)")
strA.str = "hello, swift"
print("strA: \(strA.str), strB: \(strB.str)")
// 修改引用者的值
strB.str = "你好,世界!"
print("strA: \(strA.str), strB: \(strB.str)")
//: Out: "strA: 你好,世界!, strB: 你好,世界!\n"
//: 新舊變量的值都發生著相應的變化。
//: ## Swift中值類型有
//: - 枚舉型
enum CommpassPoint {
case North
case South
case East
case West
}
var p1 = CommpassPoint.North
var p2 = p1
print("p1: \(p1), p2: \(p2)")
p2 = .South
print("p1: \(p1), p2: \(p2)")
//: "p1: North, p2: South\n"
//: 所輸出的兩個值不一樣,即枚舉類型屬于值類型
???
在上面的數據中,除了「類」是引用類型之外,其它的所有數據類型都是值類型。
記得在C語言中,有指針的概念,每個對象都有一個地址來用于記錄內容,對于值類型數據,就相當于把個址再重新復制一個,因而兩個內容表面看起來是一樣的,實際是指向兩個不同地址的,當其中一個被修改時,并不會影響到另一個。而引用則是指向同一地址的,自然是一個變了,就會修改到地址,而另一個也就跟著變化。