gpt4 book ai didi

Swift泛型函数根据泛型类型调用底层方法

转载 作者:搜寻专家 更新时间:2023-10-31 08:30:05 24 4
gpt4 key购买 nike

我正在为其他人的代码 (SEC) 编写一个接口(interface),我有一长串或多或少像这样的函数:

public func readString(_ row: Row, columnName: String) -> String? {
return SEC.getString(row, columnName)
}

public func readInt(_ row: Row, columnName: String) -> Int? {
return SEC.getInt(row, columnName)
}

等等。

我想做的是有一个单一的功能:

public func read<T>(_ row: Row, columnName: String) -> T? {
// call correct SEC.get* method
}

我在 TT.Type 上尝试了一个简单的 switch 语句,但没有成功。我还尝试了上面的修改版本:

public func read<T: ReadableType>(_ row: Row, columnName: String) -> T? {
let getter = T.getterMethod
return getter(row, columnName)
}

我可以在其中创建具有 SEC.get* 函数的元类型的 enum,并扩展它以返回正确的 getter 方法。这对我来说似乎很理想。唉:

public enum ReadableTypes {
case String.Type // nope
case Int.self // also nope
}

我不确定还能尝试什么;如果我只有十几个 read* 方法,这还不是世界末日,但如果我可以将其通用化,调用此方法的代码可能会非常紧凑。

最佳答案

您可以单独测试以查看通用占位符代表什么类型,如下所示:

if T.self is Int.Type //...

可以在 switch..case 语句中完成相同类型的测试。

假设 SECSECType 类型,我要做的是扩展 SECType 以获得通用的 get以返回类型为键的方法:

extension SECType {
public func get<T>(_ row: Row, _ columnName: String) -> T? {
// switch on the generic type
switch T.self {
// As much as I dislike force-unwrapping an Optional
// this is about as safe as it gets.
case is Int.Type : return getInt (row, columnName) as! T?
case is String.Type: return getString(row, columnName) as! T?
//...
default: return nil
}
}
}

现在您可以编写自己的read 函数,例如:

public func read<T>(_ row: Row, columnName: String) -> T? {
return SEC.get(row, columnName)
}

当然,您可以跳过执行扩展,而只执行带有开关 的通用函数。但是,将方法添加到类型是无害的,并且类型具有这样的泛型方法是有意义的。

关于Swift泛型函数根据泛型类型调用底层方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46249629/

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