假设我有一个 AnyObject
类型的数组。
let grabBag: [AnyObject] = [ "Tom", 4, "Dick", NSObject(), "Harry" ]
我希望将其转换为字符串
数组,并仅提取实际上是字符串
的元素。 我期望这段代码可以工作:
let strings = grabBag.filter{ $0 is String } as! [String] // 1
但是它会报错,错误信息为'Bool' is not convertible to 'String'
。然而下面的代码可以正常运行:
let definitelyStrings = grabBag.filter{ $0 is String } // 2
let strings = definitelyStrings as! [String] //
为什么2
可行而1
不行?是否有一种比2
更简单的方法从一个[AnyObject]
中提取和转换元素为[T]
类型?
let strings = grabBag.filter{ $0 is String }
就足够了。无需强制类型转换。通过strings is [String]
证明它是正确的,该语句将返回true。 - vadianlet strings = grabBag.filter{ $0 is String }
返回的是带有 OP 的grabBag
数组的[AnyObject]
,而不是[String]
。 - Eric AyagrabBag.filter{ $0 is String } .map{$0.lowercaseString }
,这通常在[AnyObject]
中是不可能的。 - vadian[AnyObject]
来实现这个功能。let lc = grabBag.map{ $0.lowercaseString }
。它返回一个[String!]
。这主要是因为在此上下文中,[AnyObject]
隐式映射到NSArray
。如果没有导入Foundation,您将无法执行此操作。 - Rob Napier