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

时间:2016-04-26 17:09:38

标签: swift swift-protocols

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

我已尝试过此功能签名func foo<T: NSObject where T: NSObjectProtocol>(record: T) -> NSDate? { ... },但没有运气。

有什么想法吗?

2 个答案:

答案 0 :(得分:5)

这是协议的用途:

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()
    }
}

协议为您提供了其他语言所具有的多重继承功能。基本上你声明了一个两个类都应该有的方法,并在每个类上实现该方法以使用你需要的特定变量。

答案 1 :(得分:1)

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

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"