当我试图"翻译时,我遇到了一个问题。 Swift的一些Objective-C代码。我在CoreData中定义了Garage和Car。车库与汽车有关系。我有一个masterviewcontroller来显示" Garage" class和detailviewcontroller来显示" car"的NSArray。类。这是我在Objective-C中的代码。当它是零时,我想让汽车= allobjects;否则就回来吧。
@property (nonatomic, strong) NSArray* cars;
- (NSArray*) cars {
if (_cars == nil) {
_cars = self.garage.cars.allObjects;
}
return _cars;
}
然而,在Swift中,它没有属性的下划线实例,我不能让汽车== nil,因为" =="不能应用于[Car]类型的操作数。我尝试使用以下代码,但它给了我两个错误:"尝试访问'汽车'在自己的吸气剂中#34;和"不能指定类型' [AnyObject]的值?'价值类型' [汽车]'"
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
}
}
感谢您的帮助。
答案 0 :(得分:3)
我可能会建议只有一个计算属性:
var cars : [Car]? {
return garage?.cars.allObjects
}
并且,请记住制作cars
变量和可选数组。
答案 1 :(得分:0)
看起来你需要一个懒惰的属性:
lazy var cars: [Car]? = self.garage?.cars.allObjects
答案 2 :(得分:0)
是的,您需要lazy var。
您的代码将是(Swift 2.3):
lazy var cars: [Car]? = { [unowned self] in
return self.garage?.cars.allObjects
}()
诀窍是 {和 [无主自我]
sintax中的懒惰变量实例值只有一次并且保留它,也许它就是你想要的。
也许你只需要一个包装器来获取每次 self.garage?.cars.allObjects 的值,在这种情况下你需要一个计算的var,而不是一个带有静态值的懒惰变量
var cars: [Car]? {
get {
return self.garage?.cars.allObjects
}
}
答案 3 :(得分:-1)
在Swift中,通常用变量(var)替换属性;如果可以在init方法中设置属性并在此之后保持不变,则可以使用(let)。
在你的情况下,你有自己的"得到"方法。在Swift中,当你有getter或setter方法时,没有后备变量。那么你做什么,你创造一个。通常作为具有前导下划线的私有变量。
您应该考虑如何将变量重置为nil。拥有一个setter并不是一个好主意,因为你只想允许将变量设置为nil而不是其他任何东西。如果它只在类本身内设置为nil,则可以将带有下划线的变量设置为nil。否则,您可能会添加类似" resetCars"的功能。
请注意,如果你有一个" get"方法,但没有"设置","将设置"并且" didSet",您可以在没有任何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
}