Swift 'if let ... as?' 使用 NSMutableArray 安全解包
Swift 'if let ... as?' safe unwrap with NSMutableArray
我正在学习如何在 Swift 中安全地解包可选值,但是出于某种原因,filteredList[0] 必须在此处返回 nil,因为 if let 语句中代码的 none 是执行。但是,打印 filteredList 可确保 NSMutableArray 中包含某些内容!看起来很简单,但为什么会返回 nil? and/or if let 语句中的代码没有执行?
func filterOutNoItemsInCommon(randomItem: (NSArray) -> NSDictionary, listOfItems: NSArray) -> (NSArray, NSArray, Set<String>) {
var filteredList = NSMutableArray()
var filteredListCounter = 0
var setOfAtt: Set = Set<String>()
var selectedItem = NSArray()
var rank: Int = 0
if let itemArray: NSArray = randomItem(listOfItems)["attributes"] as? NSArray {
selectedItem = itemArray
for item in itemArray {
setOfAtt.insert(item as! String)
}
}
for number: Int in 0..<listOfItems.count {
rank = 0
if let listOfItems = (listOfItems[number]["attributes"] as? NSArray) {
if let arrayOfItems = listOfItems as? Array<String> {
if !setOfAtt.isDisjointWith(arrayOfItems) {
filteredList.addObject(listOfItems[number])
for ln in arrayOfItems {
if setOfAtt.contains(ln) {
rank++
}
}
var dictForRank: NSMutableDictionary = ["rank": rank]
println(dictForRank)
println("TEST\(filteredList[0])")
// this is where the code doesn't execute
if let thisIsAnArray = filteredList[0] as? NSMutableArray {
println("TEST123")
println(thisIsAnArray)
filteredList[filteredListCounter].addObject(dictForRank)
}
filteredListCounter++
}
}
}
}
return (filteredList, selectedItem, setOfAtt)
}
对象是 NSDictionary
或 NSMutableDictionary
,而不是 NSMutableArray
,因此安全向下转换失败。
您认为是 nil
的推理是不正确的; nil
或 不兼容的类型将导致安全 unwrap/downcast 失败。
我正在学习如何在 Swift 中安全地解包可选值,但是出于某种原因,filteredList[0] 必须在此处返回 nil,因为 if let 语句中代码的 none 是执行。但是,打印 filteredList 可确保 NSMutableArray 中包含某些内容!看起来很简单,但为什么会返回 nil? and/or if let 语句中的代码没有执行?
func filterOutNoItemsInCommon(randomItem: (NSArray) -> NSDictionary, listOfItems: NSArray) -> (NSArray, NSArray, Set<String>) {
var filteredList = NSMutableArray()
var filteredListCounter = 0
var setOfAtt: Set = Set<String>()
var selectedItem = NSArray()
var rank: Int = 0
if let itemArray: NSArray = randomItem(listOfItems)["attributes"] as? NSArray {
selectedItem = itemArray
for item in itemArray {
setOfAtt.insert(item as! String)
}
}
for number: Int in 0..<listOfItems.count {
rank = 0
if let listOfItems = (listOfItems[number]["attributes"] as? NSArray) {
if let arrayOfItems = listOfItems as? Array<String> {
if !setOfAtt.isDisjointWith(arrayOfItems) {
filteredList.addObject(listOfItems[number])
for ln in arrayOfItems {
if setOfAtt.contains(ln) {
rank++
}
}
var dictForRank: NSMutableDictionary = ["rank": rank]
println(dictForRank)
println("TEST\(filteredList[0])")
// this is where the code doesn't execute
if let thisIsAnArray = filteredList[0] as? NSMutableArray {
println("TEST123")
println(thisIsAnArray)
filteredList[filteredListCounter].addObject(dictForRank)
}
filteredListCounter++
}
}
}
}
return (filteredList, selectedItem, setOfAtt)
}
对象是 NSDictionary
或 NSMutableDictionary
,而不是 NSMutableArray
,因此安全向下转换失败。
您认为是 nil
的推理是不正确的; nil
或 不兼容的类型将导致安全 unwrap/downcast 失败。