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
相关产品推荐
相关产品推荐

