gpt4 book ai didi

swift - 将 [AnyObject] 转换为可能是也可能不是集合类型的泛型

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

我有一个 AnyObject 的数组,我想将它(或其对象的一个)转换为通用类型 T这可能是也可能不是数组。

我的第一次尝试:

class MyClass<T> {

func someMethod() -> T? {

let anyObjectArray: [AnyObject] = // ... array obtained from Objective-C framework

if let objectsAsCollection = anyObjectArray as? T { // Cast always fails
return objectsAsCollection
} else if let firstObject = anyObjectArray.first as? T {
return firstObject
} else {
return nil
}
}
}

第一个if let T 时转换失败是一个 Array (例如 T.self == Array<SomeObject>.self )。

我会尝试这样的事情,但它涉及以某种方式引入另一个通用参数,所以写的是无效的:

extension MyClass where T == Array<U> {

fun someMethod() -> T? {

let anyObjectArray: [AnyObject] = // ... array obtained from Objective-C framework

if let objectsAsCollection = anyObjectArray.flatMap({ $0 as? U }) {
return objectsAsCollection
} else if let firstObject = anyObjectArray.first as? T {
return firstObject
} else {
return nil
}
}
}

想要这样做的原因是我正在使用 Objective-C 框架 (RestKit) 从 REST API 获取结果。我在 Swift 的顶部构建了一个层,它根据发出的请求将这些结果作为特定类型传回,所以我有一个 Result看起来像这样的类型:

enum Result<T>: {
case Success(T)
case Failure(Error)
}

有时 T是单个对象,有时它是对象数组,但 Objective-C 框架始终以数组形式返回结果。

最佳答案

以下语法将起作用:

class MyClass<T> {
func someMethod() -> T? {
// let's not convert to [AnyObject] here, keep it as NSArray
let anyObjectArray: NSArray = ...

// For some reason conversion from [AnyObject] to [T] fails...
// However, conversion from NSArray is special
if let objectsAsCollection = anyObjectArray as? T {
return objectsAsCollection
} else if let firstObject = (anyObjectArray as [AnyObject]).first as? T {
return firstObject
} else {
return nil
}
}
}

但是,这只是一个可能的错误的解决方法。我们可以将问题归结为以下几点:

class GenericClass<T> {
func someMethod() {
let anyObjectArray: [AnyObject] = ["test1", "test2", "test3"]

print(T) //Array<String>
print(T.self == Array<String>.self) //true

print(anyObjectArray is [String]) //true
print(anyObjectArray is T) //false - BUG
}
}

let instance = GenericClass<[String]>()
instance.someMethod()

(报告:SR-1054)

对我来说这看起来像是一个明显的错误。它实际上看起来像是 Type of optionals cannot be inferred correctly in swift 2.2 中讨论的错误的另一个实例。

关于swift - 将 [AnyObject] 转换为可能是也可能不是集合类型的泛型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36130297/

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