我正在努力理解为什么我在使用Swift的iOS项目中遇到此编译器错误。如果我创建以下类:
class InitTest {
let a: Int
let b: Int
let c: Int
init () {
self.a = 3
self.b = 4
self.c = self.runCalculation()
}
func runCalculation () -> Int {
return self.a * self.b
}
}
我在self.c = self.runCalculation()
“初始化前使用了变量’self.c’” 这一行上收到编译器错误。
起初我以为这是因为编译器无法验证该runCalculation()
方法是否无法访问self.c
,但是后来我尝试将init方法混入一点:
init () {
self.a = 3
self.c = self.runCalculation()
self.b = 4
}
这次的错误是“在初始化之前使用了变量’self.b’”(在同一self.runCalculation()
行上)。这表明编译器 是
能够检查其性能的方法访问,所以据我可以看到应该有最初的情况下,没有问题的。
当然,这是一个简单的示例,我可以轻松地进行重构以避免调用计算方法,但是在实际项目中,可能会有多个计算,每个计算都可能涉及到很多。我希望能够分离出保持可读性的逻辑。
幸运的是,有一个简单的解决方法:
init () {
self.a = 3
self.b = 4
self.c = 0
self.c = self.runCalculation()
}
(或使用属性初始化程序let c = 0
),但我想了解为什么编译器在第一个示例中有问题。我是否缺少某些东西,还是不必要的限制?
由于两阶段初始化,Swift具有此行为。从Apple的Swift书中:
Swift中的类初始化是一个分为两个阶段的过程。在第一阶段,每个存储的属性都由引入它的类分配一个初始值。一旦确定了每个存储属性的初始状态,便开始第二阶段,并且在考虑将新实例准备使用之前,每个类都有机会自定义其存储属性。
在第一阶段结束之前,类需要某种默认值。定制值是第二阶段的一部分。
Objective-C没有这种行为,因为它总是可以0
为基元和nil
对象提供默认值,但是在Swift中,没有机制可以提供此类默认值。
问题内容: 如何使用类型初始化变量? 因为我有错误 问题答案: 常量声明不能包含函数调用(某些例外,请参见下文),它们必须在编译时进行评估,而函数调用是在运行时进行的。 引用规格:常量: 常数值由符文,整数,浮点数,虚数或字符串文字表示,标识符表示常数,常数表达式,结果为常数的转换或某些内置结果的值函数,例如应用于任何值,或应用于某些表达式,以及应用于常量,以及应用于数字常量的复数。 并引用Spe
问题内容: 我有一个初始化为的变量: 问题是,在某个时候,我需要重置此变量,以便在更改后可以再次初始化。但是如果我将类设置为可选的话,LLVM在尝试将它设置为时会给我一个错误。如果我只是使用将其重置在代码中的某个位置,它将最终显示为。 有没有一种方法可以使用并允许自己重置? 问题答案: 懒惰是明确的仅一次初始化。您要采用的模型可能只是按需初始化模型: 现在,只要是,它会被初始化并返回。可以通过设置
本文向大家介绍tensorflow 初始化未初始化的变量实例,包括了tensorflow 初始化未初始化的变量实例的使用技巧和注意事项,需要的朋友参考一下 今日在Stack Overflow上看到一个问如何只初始化未初始化的变量,有人提供了一个函数,特地粘贴过来共大家品鉴: 通过tf.global_variables()返回一个全局变量的列表global_vars, 然后以python列表解析式的
我已经检查过自己,我写了一个这样的程序 我运行了几次程序,结果始终是一样的,零。我在C中尝试过,结果是一样的。 但我的教科书说 如果未初始化函数内定义的变量,则该变量值将保持未定义状态。这意味着该元素具有以前驻留在内存中该位置的任何值。 当程序始终将可用内存位置分配给变量时,这怎么可能?它怎么可能是零以外的东西(我假设默认的可用内存值为零)?
我有以下Java代码: 但是,当我运行它时,它会抛出以下错误: 我在do之前初始化了变量。while 循环,并在 try. 中设置值。捕获循环。似乎尚未设置该变量。抱歉,如果这是一个相当基本的问题,但我似乎无法弄清楚。
问题内容: 我的Java程序中出现以下错误: Java变量未初始化错误…错误:变量nam和r未初始化位置类子级 但是并且已经初始化,但是我仍然遇到相同的错误。 问题答案: 不要获取 默认值 ,应在使用它们之前对其进行初始化,并使用main中的默认值进行初始化,这样就可以了。 顺便说一句,考虑为您的类和变量命名是有意义的。