【问题标题】:Confusion with downcasting value in Swift对 Swift 中的向下转换值感到困惑
【发布时间】:2020-11-24 07:46:13
【问题描述】:

我有两个数组。

var searchedArray: NSMutableArray!
var libraryArray: NSMutableArray!

我正在尝试修复我的 searchBar 功能,因为它总是显示 nil(searchedArray = nil)。 我试图以不同的方式对其进行贬低,但它不起作用。 这是sn-p。

let laMutableCopy = (downloadManager.libraryArray as NSArray).mutableCopy()
        searchedArray = laMutableCopy.filter{
            guard let dict = $0 as? Dictionary<String, Any> else {return false}
            guard let title = dict["title"] as? String else {return false}
            return title.range(of: searchText, options: [caseInsensitive, .anchored]) != nil
            } as? NSMutableArray

【问题讨论】:

  • 在 Swift 3+ 中,更喜欢 Stuff 而不是 NSStuff,例如 Array 而不是 NSArray。有问题吗?首先不要在一行中进行太多操作来调试。不是 NSArray 而不是 NSMutableArray 吗?
  • 你为什么使用 Objective-C 数组?为什么要使用强制选项? “它不起作用”是什么意思?
  • 这不是我的项目。我需要用这些数组解决这个问题。 “它不起作用”意味着在所有情况下“searchedArray”都是 nil。

标签: swift casting


【解决方案1】:

下面是一个可行的例子:

var libraryArray = [
    ["title": "foo"],
    ["title": "bar"]
]

var filteredArray = libraryArray.filter{
    // your production code doesn't have to be like this, but when attempting to debug
    // its very helpful to break each cast out into its own assign to see where you
    // are failing
    guard let dict = $0 as? Dictionary<String, Any> else { return false }
    guard let title = dict["title"] as? String else { return false }
    return title.range(of: "fo", options: [.caseInsensitive, .anchored]) != nil
} as? Array<Dictionary<String, Any>>

您的代码的问题在于您将filter(快速Array)的结果转换为NSMutableArray。 Swift 数组可以转换为NSArray,但如果不构造这样的副本,它们就不能转换为NSMutableArray

(libraryArray as NSArray).mutableCopy()

【讨论】:

  • 上面的代码显示了这个错误。无法分配类型“Array>?”的值键入'NSMutableArray?',插入' as! NSMutableArray'.
  • Sam,停止使用 Objective-C 数组。使用 Swift 数组。
猜你喜欢
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-30
  • 2018-06-15
  • 2016-05-27
  • 2011-02-02
相关资源
最近更新 更多