看看下面的代码片段
struct Person{
var name: String
let surname: String
var closure: (()->())?
init(name: String, surname: String){
self.name = name
self.surname = surname
}
}
var person = Person(name: "John", surname: "Lennon")
let cl = {
print(person.name)
}
person.name = "Bill"
cl()
print(person.name)
Run Code Online (Sandbox Code Playgroud)
上面代码片段的输出是
Bill
Bill
Run Code Online (Sandbox Code Playgroud)
有人可以解释这是如何发生的吗?我认为,由于闭包是引用类型并且Person
是值类型,因此当创建闭包时,它会获得自己的副本Person
(因为值类型是在传递时复制的),因此修改外部Person
不应影响Person
闭包捕获的内容,但它似乎这样不行。我是 swift 和 value 类型的新手,所以请不要太严格地判断我的问题。
谢谢
PS 我知道我们可以使用捕获列表显式捕获值变量,在这种情况下修改外部变量不会影响捕获的变量。问题与此无关。问题在于我认为即使没有显式捕获它也应该具有相同的方式
在 iOS 13 之前,可以调用Locale.preferredLanguages.first
获取通用设备语言,但 iOS 13 引入了特定于应用程序的语言。问题是,如果您选择与语言不匹配的特定于应用程序的语言,preferredLanguages
那么它将被推送到数组的开头,但是如果您选择与包含的语言匹配的语言,preferredLanguages
则该语言将保持不变它的地方。因此,从 iOS 13 开始,我们无法确定第一种语言preferredLanguages
确实是通用设备语言,而且数组的更新方式也非常奇怪。我整天都在考虑这个问题,但找不到解决方案。也许有人知道在 iOS 13 设备上获取通用设备语言的方法?谢谢
我目前正在学习 C 指针并试图了解一些行为。请看下面的代码片段
#include <stdio.h>
int *foo() {
int x = 7;
return (int *)x;
}
int main()
{
int *p = foo();
printf("%d", p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出: 7
我想知道为什么要打印 7?在我的理解中 7 存储在堆栈上并(int *)x
返回指向堆栈内存的指针,当foo
返回“它的堆栈部分应该被清除”时,为什么p*
仍然指向7
. 发生这种情况是否是因为存储的内存7
尚未被其他数据覆盖或正在发生其他事情并且我完全误解了这种行为?对不起,如果你认为我的问题很愚蠢,我只是在学习 C