Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Swift中使用惰性var的优势是什么_Swift - Fatal编程技术网

在Swift中使用惰性var的优势是什么

在Swift中使用惰性var的优势是什么,swift,Swift,初始化的优点或区别是什么: lazy var hintView: HintView = { let hintView = HintView() return hintView }() 不要简单地使用: var hintView = HintView() (HintView是:classhintview:UIView{}) 非常感谢您的帮助。在某些情况下,使用lazyvars可能会更快,因为当您第一次访问它们时,它们只计算一次。只有在第一次访问时,才会计算laz

初始化的优点或区别是什么:

lazy var hintView: HintView = {
        let hintView = HintView()
        return hintView
}()
不要简单地使用:

var hintView = HintView()
HintView
是:
classhintview:UIView{}


非常感谢您的帮助。

在某些情况下,使用
lazy
vars可能会更快,因为当您第一次访问它们时,它们只计算一次。

只有在第一次访问时,才会计算lazy存储属性

它是
var
而不是
let
,因为该值在初始化过程中未初始化。以后再计算。这就是为什么惰性存储属性需要是
变量
,而不是
常量

lazy var hintView: HintView = {
        let hintView = HintView()
        return hintView
}()

let h = hintView
在上述代码中,每当第一次访问
hintView
时,将执行分配给它的
闭包
,并返回值并存储在
h

有关更多信息,请参阅:

延迟存储属性与存储属性 使用惰性属性而不是存储属性有一些好处

  • 只有在读取该属性时,才会执行与该懒惰属性关联的闭包。因此,如果由于某种原因,该属性未被使用(可能是由于用户的某些决定),则可以避免不必要的分配和计算
  • 可以使用存储属性的值填充惰性属性
  • 您可以在惰性属性的闭包中使用
    self

  • 让我们实事求是地做吧。看到截图了吗

    我刚刚在
    viewDidLoad
    中停止了调试器。您可以看到,
    secondHintView
    具有一个内存,因为它是不懒惰的存储,但是
    hintView
    仍然是nil,因为它是一个懒惰的内存。一旦使用/访问惰性变量,内存就会被分配


    同样,lazy应该始终是var。

    在一个单独的函数中分离变量的内容/计算也是一个很好的做法,以确保可读性,如下所示:

    // MARK: Public views
    lazy var titleView = getTitleView()
    lazy var hintView = getHintView(.red)
    lazy var secondHintView = getHintView(.blue)
    lazy var thirdHintView = getHintView(.yellow)
    lazy var fourthHintView = getHintView(.brown)
    
    // MARK: Private functions
    private func getTitleView() -> TitleView {
       let view = TitleView()
       return view
    }
    
    private func getHintView(_ textColor: UIColor) -> HintView {
       let view = HintView()
       view.textColor = textColor
       return view
    }
    

    这样,您就可以重用一些功能,只需编写更少的代码,所有变量的可读性也会大大提高。例如,我有5个独立的变量,但我一眼就能看到它们。

    鉴于
    hintView
    是某类型的成员,某个实例迟早会被实例化(比如instance
    foo
    );后者将始终实例化
    foo
    HintView
    实例(作为成员属性),而前者仅在访问
    foo.HintView
    时实例化
    HintView
    实例。如果一个
    HintView
    的实例化相当于一些计算上的繁重负载,那么只有当它所绑定的属性被实际使用时,才可以执行此实例化。@dfri非常感谢您的详细描述。因为这完美地回答了我的问题,请随时发布答案。我相信现有的答案也很好地涵盖了这一点,所以我将把它作为上面的评论。很乐意帮忙!也许值得指出一点(我在下面没有看到):
    静态
    属性默认为
    惰性
    (可变和不可变)。惰性变量只执行一次,初始值不会在每次尝试访问该值时更改。存储的let属性也会计算一次,你的意思是什么?我猜他是想和盖特比较variables@J.Doe关键是let立即计算一次,而lazy只在请求时计算——这意味着如果您从未尝试访问lazy变量,它将永远不会被计算。当变量计算比一些简单的初始化更复杂时,这可能很有用。请举例说明我们应该在哪里使用lazy var。@anes您可以在等待响应的变量中使用lazy<代码>延迟var响应,因为在调用服务之前,响应不在那里。如果您想在vc上显示customAlert,您可以使用lazy,但这并不总是添加到vc上。它将从某些条件中添加<代码>视图等。