[英]Learning Swift - inout functions - Why do they modify the global variable values?
我來自Java語言背景,我希望在Swift的inout中獲得一些清晰度。
在Javascript中,函數的參數僅存在於該函數的范圍內。 因此,例如,我可以毫無問題地做到這一點。
function greet(name) {
name = "randomDude";
return name
}
greet("Barry");
之所以可行,是因為參數名稱僅存在於greet函數的范圍內。 因此,我可以更改name的值。
但是,在Swift中,我不能這樣做:
func greet(name: String) {
name = "Ardvark"
print(name)
}
greet(name: "Drew")
解決方案是將其更改為“ inout”函數,該函數只能采用變量,即:
func greet(name: inout String) {
name = "Ardvark"
print(name)
}
var name = "Drew"
greet(name: name)
但是,當我這樣做時,它實際上會更改var name的值。 這意味着inout函數不僅會在函數范圍內修改PARAMETER的值,還會修改全局變量。
這就是我必須接受的東西嗎? 它有沒有理由修改全局變量? 您將如何只修改函數內部的變量“名稱”?
謝謝
第二個代碼塊(第一個Swift示例)阻止您更改name
值的原因是因為在Swift 3中,所有參數都是常量。 換句話說,它們基本上都是用let
聲明的。
想象一下您的第一個Swift示例為:
func greet(let name: String) {
name = "Ardvark"
print(name)
}
顯然,您並沒有真正let
它,但這將幫助您記住參數是不可變的。 這樣可以防止您錯誤地更改值。 如果要在函數內部進行更改,請使用新變量:
func greet(name: String) {
let anotherName = "Ardvark"
print(anotherName)
}
使用inout
通過“刪除let”來更改參數,並允許您更改調用函數時使用的原始變量。
您將如何只修改函數內部的變量“名稱”?
您不在Swift 3中。該參數是不可變的。 將其分配給函數內部的新變量。
在func greet(name: String) {}
函數name
是一個常數,實際上它看起來像func greet(let name: String) {}
因此您無法對其進行修改。 讓我們添加一個新變量並為其分配name
值:
func greet(name: String) {
var newName = name
newName = "Ardvark"
print(newName)
}
只需閱讀一些Swift文檔。 得出兩個結論。
(1)默認情況下,Swift中的參數為CONSTANTS,因此好像在該參數之前有一個let關鍵字。 在函數內部的含義是,無法更改參數值,否則將引發錯誤。
(2)將您的功能更改為“ inout”功能會更改內容。 首先,它刪除了“ let”約束。 其次,當您將參數傳遞給inout參數時,稱為復制,復制。 參數的值被復制到內存中,通過函數傳遞,在函數中進行修改,並將新值分配給作為參數傳遞的原始變量。
如果考慮一下,這是兩種不同的函數類型。 換句話說,沒有像Javascript這樣的功能,您只能在函數范圍內簡單地修改參數的值。
因為:
該參數可以是CONSTANT(默認),
要么...
您使用的是inout函數,在這種情況下,參數是變量而不是常量,但該參數僅存在於將參數的原始值“傳送”到可以修改的函數中,然后吐出的目的。作為新值返回給內存中原始變量占位符。
換句話說,...(據我所知)在Swift中,無法僅在參數功能范圍內修改參數的值。 默認情況下,由於參數是常量而被禁止這樣做,或者您正在使用inout函數,該函數僅在函數內部不修改參數的值...它正在修改GLOBAL名稱空間的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.