gpt4 book ai didi

swift - 使函数能够处理不同的类作为参数

转载 作者:行者123 更新时间:2023-11-28 12:51:52 26 4
gpt4 key购买 nike

我试图将具有相同属性的不同类传递给相同的函数。我如何转换它们以用于此功能?

下面是一个简单的例子来强调我正在努力实现的目标。

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 没有命名的成员”。

我如何完成这样的事情?

最佳答案

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
}

但是如果你想修改这些值,你必须定义一个协议(protocol)并使类符合它:

protocol HasHeight {
var height: Int { get set }
}

extension HasHeight {
mutating func grow() {
self.height += 5
}
}

class A : HasHeight {
var height = 10
}

class B : HasHeight {
var height = 20
}

var a = A()
print(a.height)
a.grow()
print(a.height)

var b = B()
print(b.height)
b.grow()
print(b.height)

在这里,我将 grow() 定义为协议(protocol)扩展,以便它可用于符合 HasHeight 协议(protocol)的每个类/结构。

结果是:

10

15

20

25

您可以在别处定义它,但必须更改调用以包含 & 引用:

func grow<T: HasHeight>(inout sized: T) {
sized.height += 5
}

grow(&b)

关于swift - 使函数能够处理不同的类作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36295354/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com