返回对象属性的函数

时间:2016-05-30 13:43:44

标签: swift

我想更改对象的参数,但我想稍后决定应该更改的参数是什么。我正在考虑为此做一个功能,但不知道如何。这是一个样本:

class Car {
    var color = "green"
    var brand = "Zastava"
    var mechanic = "Mark Gaia"
}

struct Change {
    var property: String
    var newValue: String
}

let car = Car()
let change = Change(property: "brand", newValue: "Fiat")
car.propertyFromChange(change) = change.newValue  // ??? How to implement this line

如何创建一个函数来返回需要更改的对象的参数? 或者,如何选择要更改的参数? (......我想过switch陈述。这是一个好方向吗?)

我非常确定这已经在互联网上讨论过了。我已经阅读了有关功能的所有内容,但无法找到解决方案,所以我想我正在使用错误的关键字进行搜索。

4 个答案:

答案 0 :(得分:1)

在继承NSObject之后,您不需要创建一个可以像这样使用KVC的函数,或者您可以创建一个新的func来再次保护不良属性名称。

class Car: NSObject {
    var color = "green"
    var brand = "Zastava"
    var mechanic = "Mark Gaia"
}

struct Change {
    var property: String
    var newValue: String
}

let car = Car()
let change = Change(property: "brand", newValue: "Fiat")
car.setValue(change.newValue, forKey: change.property)

请记住,如果输入错误的属性名称,此代码将崩溃。

希望这能回答你的问题。

答案 1 :(得分:1)

您可以通过setValue(value: AnyObject?, forKey key: String) Car的子类来利用KVC NSObject方法。

class Car: NSObject {
  var color = "green"
  var brand = "Zastava"
  var mechanic = "Mark Gaia"
}

struct Change {
  var property: String
  var newValue: String
}

let car = Car()
let change = Change(property: "brand", newValue: "Fiat")

car.setValue(change.newValue, forKey: change.property)

答案 2 :(得分:1)

如果Car继承自NSObject,您可以免费获得键值编码,并可以使用setValue:forKey更改值

class Car : NSObject {
  var color = "green"
  var brand = "Zastava"
  var mechanic = "Mark Gaia"
}

struct Change {
  var property: String
  var newValue: String
}

let car = Car()
let change = Change(property: "brand", newValue: "Fiat")
car.setValue(change.newValue, forKey: change.property)

答案 3 :(得分:1)

您可以通过此操作简化您的方法

如果您将所有属性存储在结构本身中,则根本不需要担心。

:)希望这有帮助

    struct CarProperties {
    var color : String = ""
    var brand : String = ""
    var mechanic : String = ""
}
class Car {
    var carProperties = CarProperties()
}

let car = Car()
car.carProperties.color = "Green"
car.carProperties.brand = "yourFavBrand"
car.carProperties.mechanic = "whatever"

let change = "this"

// Suppose you want to change the  brand
car.carProperties.brand = change

print(car.carProperties.brand)