gpt4 book ai didi

swift - 在闭包中返回泛型类型的动态泛型参数?

转载 作者:搜寻专家 更新时间:2023-11-01 07:25:35 25 4
gpt4 key购买 nike

我正在尝试为复杂场景实现一个简单的 API。我有一种异步检索数据的类型(实际上是蓝牙设备)。所以我试图最终得到的 API 是这样的:

peripheral.requestData(.Temperature) { value: Double in
print(value)
}

我从 this amazing article 得到了一些好主意,所以这就是我试图实现上述目标的方法:

class MyPeripheral {

class Keys {
static let Temperature = PeripheralKey<Double>("Temperature")
static let UserData = PeripheralKey<[String: String]>("UserData")
}

func requestData(service: Keys, handler: (value: ???Get ValueType from PeripheralKey???) -> Void) {
if let service = service as? PeripheralKey<Int> {
service.key //Do something
} else if let service = service as? PeripheralKey<[String: String]>
//Do something else
}
}
}

class PeripheralKey<ValueType>: MyPeripheral.Keys {
let key: String

init(_ key: String) {
self.key = key
}
}

我在处理返回的闭包类型时遇到了问题。我想根据传入的外围通用类型键进行强类型化,但无法掌握如何做到这一点,或者可能需要不同的方法?任何帮助或指导将不胜感激!!

最佳答案

您可以在 oder 中使用通用参数来获取 service 的值类型.为了静态使用它,我建议使用 PeripheralKey<T>而不是它的子类:

class MyPeripheral {

class Keys {
static let Temperature = PeripheralKey<Double>("Temperature")
static let UserData = PeripheralKey<[String: String]>("UserData")
}

// use a generic parameter T
func requestData<T>(service: PeripheralKey<T>, handler: (value: T) -> Void) {
// if you do similar things like in your posted link
// you can use ("data" has to be defined by you):
// data[service.key] as! T
}
}

// make class final as long as you don't subclass it
final class PeripheralKey<ValueType>: MyPeripheral.Keys {
let key: String

init(_ key: String) {
self.key = key
}
}

let peripheral = MyPeripheral()
// here you can omit the explicit Double declaration
peripheral.requestData(.Temperature) { value in
print(value)
}

在 Swift 3.0 发布后,你可能会把静态属性放在泛型类型中,这样你就可以像这样只使用一个结构:

struct PeripheralKey<ValueType> {

static let Temperature = PeripheralKey<Double>("Temperature")
static let UserData = PeripheralKey<[String: String]>("UserData")

let key: String

init(_ key: String) {
self.key = key
}
}

关于swift - 在闭包中返回泛型类型的动态泛型参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36576219/

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