簡體   English   中英

學習Swift-inout函數-為什么要修改全局變量值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM