class UserDataStore {
}
class ProfileInteractor {
var userDataStore: UserDataStore?
init(userDataStore: UserDataStore?) {
self.userDataStore = userDataStore
}
}
var profileInteractor = ProfileInteractor(userDataStore: UserDataStore())
var userDataStore = profileInteractor.userDataStore
profileInteractor.userDataStore = nil
print(profileInteractor.userDataStore == nil) // prints: true
print(userDataStore == nil) // prints: false
print(userDataStore === profileInteractor.userDataStore) // prints: false
答案 0 :(得分:2)
我认为您误解将nil
分配给userDataStore
的目的。
将userDataStore
分配给nil
意味着它不会指向任何东西,即它将被销毁;这应该不导致让profileInteractor.userDataStore
也是nil
。 Swift中的nil
意味着什么都没有,not
意味着它是指向内存中空白空间的指针。
为了更清楚,请查看以下代码段:
class UserDataStore: CustomStringConvertible {
var title: String?
var description: String {
return "\(title)"
}
init(_ title: String) {
self.title = title
}
}
class ProfileInteractor {
var userDataStore: UserDataStore?
init(userDataStore: UserDataStore?) {
self.userDataStore = userDataStore
}
}
var profileInteractor = ProfileInteractor(userDataStore: UserDataStore("Hello"))
var userDataStore = profileInteractor.userDataStore
print(userDataStore === profileInteractor.userDataStore) // prints: true
print(profileInteractor.userDataStore) // prints: Optional(Optional("Hello"))
userDataStore?.title = "Bye"
print(profileInteractor.userDataStore) // prints: Optional(Optional("Bye"))
userDataStore = nil
print(profileInteractor.userDataStore) // prints: Optional(Optional("Bye"))
希望这会有所帮助。
答案 1 :(得分:1)
为什么userDataStore没有指向profileInteractor.userDataStore!?
在这一行:
var profileInteractor = ProfileInteractor(userDataStore: UserDataStore())
您创建了一个新的ProfileInteractor
对象和一个新的UserDataStore
对象。然后,您使profileInteractor
引用ProfileInteractor
对象。
在下一行:
var userDataStore = profileInteractor.userDataStore
您正在使userDataStore
引用与profileInteractor.userDataStore
相同的对象。现在,使用UserDataStore
对userDataStore
}对象所做的任何操作都会反映在profileInteractor.userDataStore
上,因为它们基本上是相同的。
然而,这一行改变了一切:
profileInteractor.userDataStore = nil
你让profileInteractor.userDataStore
没有提及。 不意味着UserDataStore
对象被销毁。这只是意味着您不再可以使用profileInteractor.userDataStore
来访问UserDataStore
对象。但是猜猜仍然指的是UserDataStore
对象? userDataStore
!
所以问题的答案是userDataStore
确实指向与profileInteractor.userDataStore
相同的对象,直到您将profileInteractor.userDataStore
设置为nil。
我该怎么办,userDataStore指向它?
嗯,你已经做到了。您刚刚在下一行代码中将profileInteractor.userDataStore
指向其他。
如果你想让局部变量始终指向另一个局部变量所指向的同一个东西,那么你的代码就会变得非常混乱,就像在Ankit Thakur的答案中一样,有不安全的指针和东西。如果要将变量传递给方法,则可以使用inout
关键字。
答案 2 :(得分:0)
复制引用,隐式创建共享实例。复制后,两个变量然后引用单个数据实例,因此修改第二个变量中的数据也会影响原始
class UserDataStore {
var inst:String?
init(obj: String?) {
self.inst = obj
}
}
class ProfileInteractor {
var userDataStore: UserDataStore?
init(userDataStore: UserDataStore?) {
self.userDataStore = userDataStore
}
}
var profileInteractor = ProfileInteractor(userDataStore: UserDataStore(obj: "10"))
var userDataStore = profileInteractor.userDataStore
withUnsafePointer(to: &(profileInteractor.userDataStore)) {
print(" profileInteractor.userDataStore has address: \($0)")
}
withUnsafePointer(to: &userDataStore) {
print("userDataStore has address: \($0)")
}
withUnsafePointer(to: &(((profileInteractor.userDataStore) as! UserDataStore).inst)) {
print(" profileInteractor.userDataStore value inst has address: \($0)")
}
withUnsafePointer(to: &(((userDataStore) as! UserDataStore).inst)) {
print("userDataStore value inst has address: \($0)")
}
print(userDataStore)
print(profileInteractor.userDataStore)
profileInteractor.userDataStore = nil
print(profileInteractor.userDataStore == nil) // prints: true
print(userDataStore == nil) // prints: false
print(userDataStore === profileInteractor.userDataStore) // prints: false
输出:
profileInteractor.userDataStore has address: 0x0000610000031230
userDataStore has address: 0x000000010e8103e0
profileInteractor.userDataStore value inst has address: 0x000061000004f5b0
userDataStore value inst has address: 0x000061000004f5b0
Optional(__lldb_expr_35.UserDataStore)
Optional(__lldb_expr_35.UserDataStore)
true
false
false
这是传递值的好参考,并通过引用传递: https://developer.apple.com/swift/blog/?id=10