inout是 Swift 中的關(guān)鍵字,可以放置于參數(shù)類型前,冒號(hào)之后。使用 inout之后,函數(shù)體內(nèi)部可以直接更改參數(shù)值,而且改變會(huì)保留。
func swap(resSct: inout ResolutionStruct) {
withUnsafePointer(to: &resSct) { print("During calling: \($0)") }
let temp = resSct.height
resSct.height = resSct.width
resSct.width = temp
}
var iPhone6ResoStruct = ResolutionStruct(height: 1334, width: 750)
print(iPhone6ResoStruct)
withUnsafePointer(to: &iPhone6ResoStruct) { print("Before calling: \($0)") }
swap(resSct: &iPhone6ResoStruct)
print(iPhone6ResoStruct)
withUnsafePointer(to: &iPhone6ResoStruct) { print("After calling: \($0)") }
小結(jié):值類型變量作為參數(shù)傳入函數(shù),外界和函數(shù)參數(shù)的內(nèi)存地址一致,函數(shù)內(nèi)對(duì)參數(shù)的更改得到了保留。
需要注意的是:
1.使用 inout 關(guān)鍵字的函數(shù),在調(diào)用時(shí)需要在該參數(shù)前加上 & 符號(hào)
2.inout 參數(shù)在傳入時(shí)必須為變量,不能為常量或字面量(literal)
3.inout 參數(shù)不能有默認(rèn)值,不能為可變參數(shù)
4.inout 參數(shù)不等同于函數(shù)返回值,是一種使參數(shù)的作用域超出函數(shù)體的方式
5.多個(gè)inout 參數(shù)不能同時(shí)傳入同一個(gè)變量,因?yàn)榭饺肟匠龅捻樞虿欢?,那么最終值也不能確定
struct Point {
var x = 0.0
var y = 0.0
}
struct Rectangle {
var width = 0.0
var height = 0.0
var origin = Point()
var center: Point {
get {
print("center GETTER call")
return Point(x: origin.x + width / 2,
y: origin.y + height / 2)
}
set {
print("center SETTER call")
origin.x = newValue.x - width / 2
origin.y = newValue.y - height / 2
}
}
func reset(center: inout Point) {
center.x = 0.0
center.y = 0.0
}
}
var rect = Rectangle(width: 100, height: 100, origin: Point(x: -100, y: -100))
print(rect.center)
rect.reset(center: &rect.center)
print(rect.center)
// center GETTER call
// Point(x: -50.0, y: -50.0)
// center GETTER call
// center SETTER call
// center GETTER call
// Point(x: 0.0, y: 0.0)
inout參數(shù)的傳遞過(guò)程:
- 當(dāng)函數(shù)被調(diào)用時(shí),參數(shù)值被拷貝
- 在函數(shù)體內(nèi),被拷貝的參數(shù)修改
- 函數(shù)返回時(shí),被拷貝的參數(shù)值被賦值給原有的變量