- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个 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/
此代码将(在 Swift 1.2 中)在最后一行失败: import Foundation let dictionary1 = [String: AnyObject]() NSUserDefaults
我需要做一些简单的事情,比如将 [AnyObject?] 转换为 [AnyObject]。所以数组中的可选值应该被解包,如果为 nil 则被踢出数组。在 Swift 中有一种简单的方法可以做到这一点吗
我正在尝试使用 UIActivityViewController 共享联系人 .vcf 文件。但我收到“任何对象?”与“AnyObject”不同 下面是我的代码行: let dirs : [Strin
import Cocoa class Brain{ var internalProgram = [AnyObject]() var program:AnyObject{
如何将协议(protocol)实例数组向下转换为 AnyObject?我在下面的代码示例中尝试了一些更合理的想法。 protocol Nameable : class { var name:
在默认模板中我们可以找到以下代码: func application(application: UIApplication, didFinishLaunchingWithOptions launchO
阅读 Apple 的代码我看到了以下内容(谈论钥匙串(keychain)服务): query[kSecAttrService as String] = service as AnyObject? An
我正致力于从 Objective-C 教程转换此委托(delegate)协议(protocol)函数,但在尝试通过使用下标返回基于键的值来访问字典中的值时遇到错误。我不太确定这里的错误是什么意思。任何
我正在尝试使用 performSegueWithIdentifier 将一些字符串数据传递给 View Controller ,但我收到此错误 Cannot convert value of type
如果你看一下这个函数: typealias JSONDictionary = [String: AnyObject] private func allIdentifiersInJson(json: [
我正在尝试调用一个 Objective-C 方法,该方法采用一个 block ,该 block 使用 NSArray 进行回调。 我得到以下编译错误: AnyObject[] 不是 AnyObject
我正在为 IOS 学习 swift ,当我在 youtube 上做巡回演出时(Swift:Skip Wilson 的 Swift:使用外部数据库和 API)对于外部数据库,我找到了部分: servic
我很难理解为什么 AnyObject 的实例等于 Anyobject 的数组,即为什么这个语句 var one: AnyObject = [AnyObject ]() 有效吗? 最佳答案 用这段代码
我有两段几乎相同的代码让我感到困惑。两者都以令我惊讶的方式运作。第一个作品,如下所示: let HTTPBody = NSJSONSerialization.dataWithJSONObject(js
我正在使用 swift 库 "Sync" from Hyperoslo将 JSON 用户转换为核心数据对象。 let user = JSON.valueForKey("user") Sync.chan
我在 Swift 3.0 中工作,我的数组有问题。每行包含一个包含 2 个值的字典。 当我想更改此值时,我收到此消息: “无法使用类型为‘AnyObject’的索引下标类型为‘[AnyObject]’
let otherArray:[AnyObject] = ["a","aa","aaa"] let otherArrayElemnt = otherArray[0] let myArr
我在我的 AppDelegate.swift 文件中发现了这个错误,它出现在 AppDidFinishLaunchingWithOptions 函数中。它在来自 Parse 框架的一行代码上引发错误。
我正在尝试将我当前的项目转换为 Swift 3,但遇到了有关 objectForKey 的问题至 objectFor转换。 myData 的类型是 AnyObject 之前: let x = myDa
我有一个方法: func tableAsDictionary() -> [String: AnyObject] 然后我需要测试这个: let tableDictionary = table.table
我是一名优秀的程序员,十分优秀!