为什么引用 .self 而不是 type.sharedInstance?
Why does referencing .self work instead of type.sharedInstance?
我有一些这样的代码:
class miniUser {
///The shared instance of miniUser.
static let SI = miniUser()
init()
{
self.currentUser = self.getCurrentProfile()! as String
self.refreshUserList()
}
...
}
该代码工作正常。但是,此代码使用共享实例...
class miniUser {
///The shared instance of miniUser.
static let SI = miniUser()
init()
{
miniUser.SI.currentUser = miniUser.SI.getCurrentProfile()! as String
miniUser.SI.refreshUserList()
}
...
}
那是行不通的。事实上,它甚至不会在运行时吐出错误,它只是在代码的另一部分尝试初始化它时冻结在 0 fps(我正在使用 SpriteKit)。
理想情况下,两个版本的代码应该表示相同的意思。
任何人都可以向我解释为什么在初始化期间使用 self.function() 而不是 type.sharedInstance.function() 吗?我不确定,需要解释才能理解这里发生的事情。
任何帮助都是-- 错误,任何解释都将不胜感激。
定义 let SI = miniUser()
将调用 class 的 init()
以创建共享实例。但是,init()
正在尝试访问共享实例 miniUser.SI
,因此这是一个递归定义。编译器可能根本不应该允许它——我建议 filing a bug。如果您需要在初始化期间修改实例变量,这就是 self.
的用途。 (事实上 ,您可以省略 self.
因为它是隐含的。)
我有一些这样的代码:
class miniUser {
///The shared instance of miniUser.
static let SI = miniUser()
init()
{
self.currentUser = self.getCurrentProfile()! as String
self.refreshUserList()
}
...
}
该代码工作正常。但是,此代码使用共享实例...
class miniUser {
///The shared instance of miniUser.
static let SI = miniUser()
init()
{
miniUser.SI.currentUser = miniUser.SI.getCurrentProfile()! as String
miniUser.SI.refreshUserList()
}
...
}
那是行不通的。事实上,它甚至不会在运行时吐出错误,它只是在代码的另一部分尝试初始化它时冻结在 0 fps(我正在使用 SpriteKit)。
理想情况下,两个版本的代码应该表示相同的意思。
任何人都可以向我解释为什么在初始化期间使用 self.function() 而不是 type.sharedInstance.function() 吗?我不确定,需要解释才能理解这里发生的事情。
任何帮助都是-- 错误,任何解释都将不胜感激。
定义 let SI = miniUser()
将调用 class 的 init()
以创建共享实例。但是,init()
正在尝试访问共享实例 miniUser.SI
,因此这是一个递归定义。编译器可能根本不应该允许它——我建议 filing a bug。如果您需要在初始化期间修改实例变量,这就是 self.
的用途。 (事实上 ,您可以省略 self.
因为它是隐含的。)