当前位置: 首页 > 面试题库 >

Swift懒惰使用self实例化

邓威
2023-03-14
问题内容

我有一个让我真正困惑的事情,特别是以下代码触发了编译器错误“ unresolved identifier
self”,我不确定为什么会这样,因为懒惰意味着在使用该属性时,该类已经实例化了。我想念什么吗?

提前谢谢了。

这是代码

class FirstClass {
    unowned var second: SecondClass

    init(second:SecondClass) {
        self.second = second
        print("First reporting for duty")
    }

    func aMethod() {
        print("First's method reporting for duty")
    }
}


class SecondClass {

    lazy var first = FirstClass(second: self)

    func aMethod() {
        first.aMethod()
    }
}

问题答案:

由于某种原因,如果惰性属性的初始值引用,则需要显式类型注释self。在swift-
evolution邮件列表中
提到了这一点,但是我无法解释 为什么 这样做是必要的。

lazy var first: FirstClass = FirstClass(second: self)
//            ^^^^^^^^^^^^

您的代码将按预期编译并运行。

这是另一个示例,它说明structs 也发生了问题,即与子类无关。

func foo(x: Int) -> Int { return x + 1 }

struct MyClass {
    let x = 1

    lazy var y = foo(0)            // No compiler error
    lazy var z1 = foo(self.x)      // error: use of unresolved identifier 'self'
    lazy var z2: Int = foo(self.x) // No compiler error
}

的初始值y不依赖self且不需要类型注释。的初始值z1/z2取决于self,并且仅使用显式类型注释进行编译。

更新: 在Swift 4 / Xcode 9 beta
3中已修复此问题,惰性属性初始化程序现在可以引用实例成员self,而无需显式和无显式类型注释。(感谢@hamish进行更新。)



 类似资料:
  • 问题内容: 如果按以下方式实现单例, 此实现与延迟初始化方法有何不同?在这种情况下,实例将在加载类时创建,并且仅在第一次使用时才加载类本身(例如,Singleton.getInstance(),而当您声明实例Singleton singleton = null;时则不会)。 即使采用惰性初始化方法,该实例也是在对getInstance()的调用上创建的 我在这里想念什么吗? 问题答案: 您也可以调

  • 问题内容: 当我尝试获取懒惰的初始化实体时,我在IDE中看到以下异常消息(我无法找到它在代理实体中的存储位置,因此无法为该异常提供整个堆栈跟踪): 这是我尝试访问要使用的惰性初始化实体的字段后得到的堆栈跟踪: 我正在使用Spring Data,已配置JpaTransactionManager,数据库是MySql,ORM提供程序是Hibernate4。注释@EnableTransactionMana

  • 我有一个数据表的问题-懒加载。我认为问题是在IdiomasBean.java(TableBean.java),如果我把: 我得到了正确的数据表,但是<代码>按排序、筛选和不起作用。 我得到:java。lang.NullPointerException这里是堆栈跟踪: 下面是代码的其余部分: 指数xhtml diomasBean.java 懒散的数据模型。JAVA IdiomasBo.java 习语

  • 问题内容: 我已经使用了一段时间了,我喜欢这样的事实:该元素直到必要时才被定位(不在实例化时)。 但是,该网页可能具有某个元素2-10的任意位置,并且元素上的ID已编号(因此第一个元素的ID为“ element1”,依此类推) 我想编写一个函数,我可以在一个整数关口,它会返回一个WebElement与适当的ID, 和 被懒洋洋地实例化。这意味着具有以下功能将无法正常工作: 因为我立即调用该函数,即

  • 问题内容: 我想创建自己的集合,该集合具有python list的所有属性,并且还知道如何将自身保存到数据库中或从数据库中加载。我也想使负载隐式和惰性,因为在列表创建时它不会发生,而是等到第一次使用时才发生。 有没有一种单一的方法,我可以覆盖上加载任何列表属性(如第一次使用清单,,而不必重写他们… …等)? 问题答案: 不,没有。

  • 我试着把我的头绕到相对较新的img属性“加载”上。 我知道,如果img具有load=“lazy”属性,那么它会告诉支持该属性的浏览器,在接近视口时可以加载该属性。 那么为什么不总是设置loading=“lazy”?那些立即出现在屏幕上的图像无论如何都会被渲染,因为它们已经在视口中了。因此,在这种情况下,基本上忽略了load=“lazy”。 在这个演示https://mathiasbynens.be