在 Swift 中的两个不同对象上调用相同的函数

Call same function on two different objects in Swift

我有两个不相关的对象(第 3 方 API),它们具有一些相同的属性。我想要调用一个辅助方法,它将从属性中提取数据并构建一个 NSDate 对象,但 theObject.valueForKey 似乎不起作用。

我试过这个函数签名 func foo<T: NSObject where T: NSObjectProtocol>(record: T) -> NSDate? { ... } 但没有成功。

有什么想法吗?

如果您只想获得一个既适用于 类 又公开通用 属性 的类型,您可以使用协议并使用扩展实现协议:

class Foo {
    let name = "foo"
}

class Bar {
    let name = "bar"
}

protocol HasName {
    var name: String { get }
}

extension Foo: HasName {}
extension Bar: HasName {}

func getName(x: HasName) -> String {
    return x.name
}

getName(Foo()) // "foo"
getName(Bar()) // "bar"

这就是协议的用途:

class ClassOne {
    var dateInfo: String = ""
}

class ClassTwo {
    var otherDateInfo: String = ""
}

protocol DateBuildingProtocol {
    func buildDateFromDateInfo() -> NSDate
}

extension ClassOne: DateBuildingProtocol {
    func buildDateFromDateInfo() -> NSDate {
        // do something with self.dateInfo
        return NSDate()
    }
}

extension ClassTwo: DateBuildingProtocol {
    func buildDateFromDateInfo() -> NSDate {
        // do something with self.otherDateInfo
        return NSDate()
    }
}

协议赋予您某些其他语言所具有的多重继承能力。基本上你声明一个方法,两个 classes 都应该有,并在每个 class 上实现该方法以使用你需要的特定变量。