我想更改对象的参数,但我想稍后决定应该更改的参数是什么。我正在考虑为此做一个功能,但不知道如何。这是一个样本:
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
陈述。这是一个好方向吗?)
我非常确定这已经在互联网上讨论过了。我已经阅读了有关功能的所有内容,但无法找到解决方案,所以我想我正在使用错误的关键字进行搜索。
答案 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)