属性在object-c中用下划线实例和getter以及它们在swift中的等价物

时间:2015-07-31 13:25:08

标签: ios objective-c swift core-data

当我试图"翻译时,我遇到了一个问题。 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
    }
}

感谢您的帮助。

4 个答案:

答案 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
}