Swift 使函数能够处理不同的类作为参数
我试图将具有相同属性的不同类传递给相同的函数。如何将它们转换为与此函数一起使用 下面是一个简单的例子来强调我正在努力实现的目标Swift 使函数能够处理不同的类作为参数,swift,function,casting,anyobject,Swift,Function,Casting,Anyobject,我试图将具有相同属性的不同类传递给相同的函数。如何将它们转换为与此函数一起使用 下面是一个简单的例子来强调我正在努力实现的目标 class A { var height:Int = 10 } class B { var height:Int = 20 } class C { static func grow(class:AnyObject) { class.height + 5 } } C.grow(A) C.grow(B) 最后两个调用
class A {
var height:Int = 10
}
class B {
var height:Int = 20
}
class C {
static func grow(class:AnyObject) {
class.height + 5
}
}
C.grow(A)
C.grow(B)
最后两个调用应该产生15和25,但是如果不将AnyObject强制转换回A或B,则会生成如下错误:“AnyObject没有命名的成员”
我怎样才能完成这样的事情呢?看起来是协议的好例子!用height属性定义一个,让a和B都实现该协议,然后让grow方法接受该协议作为其参数。看起来是协议的好例子!使用height属性定义一个,让a和B都实现该协议,然后让grow方法接受该协议作为其参数。Swift reflection API允许您读取值,但不能修改它们。因此,如果这对您来说已经足够了,您可以使用类似于以下的方法,该方法获取您想要访问的成员的对象和标签:
func getValue<T>(object: AnyObject, memberLabel: String) -> T? {
let mirror = Mirror(reflecting: object)
for member in mirror.children {
if let _ = member.label where member.label == memberLabel,
let value = member.value as? T {
return value
}
}
return nil
}
在这里,我将grow()
定义为一个协议扩展,以便它在符合HasHeight
协议的每个类/结构上都可用
结果是:
十,
十五
二十
二十五
您可以在其他地方定义它,但调用必须更改为包含&
引用:
func grow<T: HasHeight>(inout sized: T) {
sized.height += 5
}
grow(&b)
func-grow(inout-size:T){
尺寸.高度+=5
}
成长(&b)
Swift反射API允许您读取值,但不能修改值。因此,如果这对您来说已经足够了,您可以使用类似于以下的方法,该方法获取您想要访问的成员的对象和标签:
func getValue<T>(object: AnyObject, memberLabel: String) -> T? {
let mirror = Mirror(reflecting: object)
for member in mirror.children {
if let _ = member.label where member.label == memberLabel,
let value = member.value as? T {
return value
}
}
return nil
}
在这里,我将grow()
定义为一个协议扩展,以便它在符合HasHeight
协议的每个类/结构上都可用
结果是:
十,
十五
二十
二十五
您可以在其他地方定义它,但调用必须更改为包含&
引用:
func grow<T: HasHeight>(inout sized: T) {
sized.height += 5
}
grow(&b)
func-grow(inout-size:T){
尺寸.高度+=5
}
成长(&b)