我遇到了一个问题,当我试图"翻译"一些Objective-C代码到Swift。我在CoreData中定义了Garage和Car。Garage和Car有一个关系,叫做cars。我有一个masterviewcontroller显示"Garage"类和detailviewcontroller显示"car"类的NSArray。这是我用Objective-C编写的代码。我想让cars = alloobjects当它为nil时;否则就返回。
@property (nonatomic, strong) NSArray* cars;
- (NSArray*) cars {
if (_cars == nil) {
_cars = self.garage.cars.allObjects;
}
return _cars;
}
然而,在Swift中,它没有一个下划线实例用于property,并且我不能让cars == nil,因为"=="不能应用于[Car]类型的操作数。我试图使用下面的代码,但它给了我两个错误:"试图访问'汽车'在自己的getter"one_answers"不能分配类型的值'[AnyObject]?'到类型为'[Car]'"的值
var garage : Garage?
var cars : [Car] {
if let a = cars {
get {
cars = self.garage?.cars.allObjects
}
}
任何帮助都是感激的。
/////////////////////////////////////////////这是我用来解决问题的方法。
private var _cars: [Car]?
var cars: [Car]?
{
get {
if _cars == nil {
_cars = self.garage?.cars.allObjects as? [Car]
}
return _cars
}
set {
_cars = cars
}
}
谢谢你的帮助。
我建议使用computed property:
var cars : [Car]? {
return garage?.cars.allObjects
}
并且,记住将cars
设置为变量和可选数组
看起来你需要一个lazy属性:
lazy var cars: [Car]? = self.garage?.cars.allObjects
是的,你需要一个懒惰变量。
你的代码将是(Swift 2.3):lazy var cars: [Car]? = { [unowned self] in
return self.garage?.cars.allObjects
}()
关键是{和[无主self]延迟变量在sintax实例中的值只一次并保留它,也许它是你想要的。
也许您只需要一个包装器来获取每次self.garage?.cars的值。allObjects在这种情况下,您需要一个计算变量,而不是一个带有静态值的惰性变量var cars: [Car]? {
get {
return self.garage?.cars.allObjects
}
}
在Swift中,你通常会用变量(var)代替属性;如果一个属性可以在你的初始化方法中设置并且之后保持不变,你可以使用(let)。
在您的例子中,您有自己的"get"方法。在Swift中,当你有一个getter或setter方法时,没有备用变量。所以你要做的就是创建一个。通常作为带有前导下划线的私有变量。你应该考虑如何将变量重置为nil。使用setter并不是一个好主意,因为您只想允许将变量设置为nil,而不允许其他任何设置。如果它只在类本身内部设置为nil,则可以将带有下划线的变量设置为nil。否则,您可能会添加一个函数,如"resetCars"。
注意,如果你有一个"get"方法,但没有"set"、"willSet"one_answers"didSet"方法,你可以只写set代码而不需要任何getter。所以典型的用法是:
private var _cars: [Car]?
func resetCars () -> Void { _cars = nil } // To allow resetting outside the class
var cars: [Car] {
if _cars == nil {
_cars = cleverlyCalculatedNonNilValue()
}
return _cars
}