在 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 上实现该方法以使用你需要的特定变量。
我有两个不相关的对象(第 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 上实现该方法以使用你需要的特定变量。