惰性 var 给出“实例成员不能用于类型”错误
Posted
技术标签:
【中文标题】惰性 var 给出“实例成员不能用于类型”错误【英文标题】:Lazy var giving 'Instance member can not be used on type' error 【发布时间】:2016-03-17 12:07:52 【问题描述】:我现在多次遇到此错误,我采用了不同的解决方法,但我真的很好奇为什么会发生这种情况。基本场景如下:
class SomeClass
var coreDataStuff = CoreDataStuff!
lazy var somethingElse = SomethingElse(coreDataStuff: coreDataStuff)
所以我知道在类完全初始化之前我不能使用 self,但在这种情况下,我使用 self 属性 coreDataStuff
来初始化一个惰性 var,它在我的实例准备好之前不会发生。
任何人都可以解释我为什么会得到
Instance member can not be used on type
错误?
【问题讨论】:
返回什么CoreDataStuff()
?
抱歉,代码示例的输入速度太快了,它没有返回任何内容,它只是展开的可选项,稍后会使用管理我的核心数据对象的实例进行初始化。澄清一下,当前版本的代码是给我一个错误的版本
可能是因为你没用过'self.coreDataStuff'?
Instance member cannot be used on type的可能重复
这与Instance member cannot be used on type不相同。这个问题处理惰性变量,而另一个处理只获取变量。 Swift 中有两个非常不同的东西。
【参考方案1】:
试试看:
class SomeClass
var coreDataStuff = CoreDataStuff!
lazy var somethingElse: SomethingElse = SomethingElse(coreDataStuff: self.coreDataStuff)
确定你的惰性变量的类型并将self.
添加到你传递的参数中很重要
【讨论】:
你能解释一下这个语法吗,因为这是我第一次看到这样的东西。将 self 作为参数传递给 SomethingElse init 是怎么回事?无论如何我都试过了,它给了我一个错误,它无法将 self 转换为 CoreDataStuff,这是正常的,因为 SomeClass 与 CoreDataStuff 无关 你有没有像我写的那样添加somethingElseType
?
哦等等,我以为SomethingElse
是一种方法……我的错
呵呵,我同时想通了,谢谢它的帮助。知道为什么当我添加自我时 swift 不会抱怨。到 coreDataStuff ?
我猜由于上下文不同(不是在方法中),所以你想要coreDataStuff
的内容而不是“指针”coreDataStuff
并不明显。而且您需要精确类型,因为由于您引入了“变量”,我猜编译器不确定它会是什么类型,因为它是惰性的。【参考方案2】:
在 Swift 中使用惰性变量很容易忽略两个要求,不幸的是,警告很隐晦,没有说明如何解决它。
惰性变量要求
使用self.
: 引用实例成员时,必须使用self.
。 (例如self.radius
。)
如果你忘记使用self.
,你会得到这个错误:
实例成员“myVariable”不能用于类型“MyType”
指定类型:类型无法推断,必须显式写入。 (例如: Float
。)
如果你忘记指定类型,你会得到这个错误:
使用未解析的标识符“self”
示例
struct Circle
let radius: Float
lazy var diameter: Float = self.radius * 2 // Good
//lazy var diameter = radius * 2 // Bad (Compile error)
【讨论】:
以上是关于惰性 var 给出“实例成员不能用于类型”错误的主要内容,如果未能解决你的问题,请参考以下文章
推送 UIViewController 时不能在类型上使用实例成员