惰性 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 时不能在类型上使用实例成员

Swift Playground - 实例成员不能用于类型自定义类

Ios Swift3:lazy var fetchrequestcontroller 显示错误