繁体   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