将属性类型作为参数传递

use*_*037 4 closures swift

有没有办法将属性作为参数传递给函数?

class Car {

    let doors : Int = 4
    let price : Int = 1000
}
Run Code Online (Sandbox Code Playgroud)

有没有办法将Car属性作为类型传递给函数?

我想实现以下目标:

func f1(car: Car, property: SomeType) {

    println(car.property)

}

let c1 = Car()

f1(c1, doors)
f1(c1, price)
Run Code Online (Sandbox Code Playgroud)

关闭帮助,如果又如何?

rin*_*aro 7

我不确定这是你想要的,但使用闭包:

func f1<T>(car: Car, getter: Car -> T) {
    println(getter(car))
}

let c1 = Car()

f1(c1, {$0.doors})
f1(c1, {$0.price})
Run Code Online (Sandbox Code Playgroud)


Rob*_*Rob 5

正如 Bill Chan 所说,现在我们将使用键路径

func f1<Value>(car: Car, keyPath: KeyPath<Car, Value>) {
    print(car[keyPath: keyPath])
}

f1(car: car, keyPath: \.doors)
Run Code Online (Sandbox Code Playgroud)

我使用类型的原始答案NSObject如下。但这种密钥路径方法通常更可取,因为它为我们提供了密钥的编译时验证。


在过去,人们可以通过子类化来使用 Objective-C 键值编码NSObject

class Car: NSObject {
    @objc let doors: Int = 4
    @objc let price: Int = 1000
}
Run Code Online (Sandbox Code Playgroud)

那么,该f1函数可以是:

func f1(car: Car, key: String) {
    guard let value = car.value(forKey: key) else { return }
    print(value)
}

f1(car: car, key: "doors")
Run Code Online (Sandbox Code Playgroud)