Swift 在惰性存储属性中使用函数时出现编译器错误
在尝试从延迟存储属性中的函数返回值时,我收到一个错误,该错误表示“无法将'String'类型的值转换为'Test'类型的参数”。我无法在lazy var的闭包中发现任何问题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()
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())。这有助于你记住,偶然捕捉自我是可能的。