object-c中的属性下划线instance和getter以及swift中的等价属性



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

最新更新