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)