Swift 在惰性存储属性中使用函数时出现编译器错误

Swift 在惰性存储属性中使用函数时出现编译器错误,swift,lazy-evaluation,swift2.1,Swift,Lazy Evaluation,Swift2.1,在尝试从延迟存储属性中的函数返回值时,我收到一个错误,该错误表示“无法将'String'类型的值转换为'Test'类型的参数”。我无法在lazy var的闭包中发现任何问题 import UIKit public struct Value {} public class Test { var id: String = "" public func getValueById(id: String) -> Value { return Value()

在尝试从延迟存储属性中的函数返回值时,我收到一个错误,该错误表示“无法将'String'类型的值转换为'Test'类型的参数”。我无法在lazy var的闭包中发现任何问题

import UIKit

public struct Value {}

public class Test {

    var id: String = ""

    public func getValueById(id: String) -> Value {
        return Value()
    }

    public lazy var value: Value = {
        // Compiler error: Cannot convert value of 'String' to expected argument type 'Test'
        return getValueById(self.id)
    }() 
}

编译器对
getValueById
感到困惑,错误消息没有任何意义——如果没有误导的话

您需要在闭包内的
getValueById(self.id)
前面添加
self

public struct Value {}

public class Test {

    var id: String = ""

    public func getValueById(id: String) -> Value {
        return Value()
    }

    public lazy var value: Value = {
        return self.getValueById(self.id)
    }() 
}

这是正确的。这是ARC一章中“解析闭包的强引用循环”(Swift编程语言)一节的引文——Swift要求您在引用闭包中的self成员时编写self.someProperty或self.someMethod()(而不仅仅是someProperty或someMethod())。这有助于你记住,偶然捕捉自我是可能的。