You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Swift 4.1中NSMutableArray调用index(of:)返回异常结果求助

为什么NSMutableArray.index(of:)返回9223372036854775807?

这个数字其实是Objective-C里的NSNotFound常量,意思是在数组中没有找到对应的元素,问题的根源在于你混合使用了Swift值类型和Objective-C的集合类,具体原因和解决方法如下:

问题原因

  • 你的Item是Swift的struct,属于值类型,而NSMutableArray是Objective-C的集合类,它只能存储Objective-C兼容的引用类型对象。当你把Swift值类型加入NSMutableArray时,系统会自动把它包装成一个__SwiftValue的桥接对象。
  • 你调用index(of: item)时,传入的是原始的Item值类型实例,而数组里存储的是包装后的__SwiftValue对象,两者不是同一个实例,所以NSMutableArray找不到匹配项,返回NSNotFound。

解决方案

方案1:改用Swift原生的Array而非NSMutableArray

Swift的Array对值类型支持非常友好,直接用它来存储Item会更符合Swift的开发习惯,查找索引也更简单:

import UIKit
import Foundation

struct Item {
    var name: String
    var message: String
}

// 直接用Swift Array存储
var items: [Item] = [
    Item(name: "name", message: "mex"),
    Item(name: "name2", message: "mex2")
]

// 方式1:匹配具体属性查找索引
if let index = items.firstIndex(where: { $0.name == "name" && $0.message == "mex" }) {
    print("找到索引:\(index)") // 输出0
} else {
    print("未找到元素")
}

// 方式2:匹配值类型实例(属性完全相同即匹配)
let targetItem = Item(name: "name", message: "mex")
if let index = items.firstIndex(of: targetItem) {
    print("找到索引:\(index)")
}

注:Swift值类型默认会自动生成Equatable实现,只要所有属性都能被比较,firstIndex(of:)就能通过属性匹配找到对应元素。

方案2:如果必须使用NSMutableArray,修改Item为类(引用类型)

把Item改成继承自NSObject的类,这样它就是Objective-C兼容的引用类型,可以直接存入NSMutableArray,index(of:)就能正常匹配实例:

import UIKit
import Foundation

class Item: NSObject { // 继承NSObject以兼容Objective-C集合
    var name: String
    var message: String
    
    init(name: String, message: String) {
        self.name = name
        self.message = message
    }
}

var itemsArray = NSMutableArray()
let item = Item(name: "name", message: "mex")
let item2 = Item(name: "name2", message: "mex2")
itemsArray.addObjects(from: [item, item2])

let index = itemsArray.index(of: item)
print(index) // 输出0,正常找到索引

额外提示

尽量避免在Swift代码中混用Objective-C集合类(比如NSMutableArray、NSDictionary),除非你有兼容旧Objective-C代码的需求。Swift原生集合不仅对值类型支持更好,还提供了更安全、更简洁的API,类型安全性也更高。

内容的提问来源于stack exchange,提问作者MaX

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:13:02