Swift 4.1中init(contentsOfURL:)调用存在歧义的问题求助
解决Swift 4.1中NSArray
init(contentsOfURL:)的歧义错误 你遇到的这个“Ambiguous use of 'init(contentsOfURL:)'”错误,本质是Swift和Objective-C桥接时的类型匹配歧义——Objective-C的NSArray(contentsOfURL:)原本接受的是NSURL类型,但你传入的是Swift原生的URL结构体,编译器无法确定要调用哪个桥接后的初始化方法。下面给你两个可行的解决方案:
方案一:明确指定NSURL类型,消除歧义
直接把Swift的URL转换成NSURL,让编译器精准匹配到Objective-C的初始化方法,同时修正文件路径的获取方式(原来的URL(string:)无法正确获取bundle内的文件):
var upsList = [Any]() func loadUpsValues () { print("loadUpsValues") // 正确获取app bundle内的Upslist.txt文件URL guard let upsFileAsURL = Bundle.main.url(forResource: "Upslist", withExtension: "txt") else { print("Upslist.txt文件不存在于bundle中") return } // 明确转为NSURL,消除初始化方法的歧义 if let nsArray = NSArray(contentsOf: upsFileAsURL as NSURL) { self.upsList = nsArray as [Any] } }
方案二:改用Swift原生API(推荐)
既然用Swift开发,尽量避免依赖Objective-C的NSArray,改用Swift原生的文件读取和数组处理方式,更符合Swift的编程风格,同时从根源上避免桥接歧义:
var upsList = [Any]() func loadUpsValues () { print("loadUpsValues") guard let upsFileAsURL = Bundle.main.url(forResource: "Upslist", withExtension: "txt"), // 读取文件内容为字符串 let fileContent = try? String(contentsOf: upsFileAsURL), // 按换行分割成数组(可根据你的文件格式调整分割符) let swiftArray = fileContent.components(separatedBy: .newlines) as [Any] else { print("读取或解析Upslist.txt失败") return } self.upsList = swiftArray }
额外注意点
你原来代码里的URL(string: "Upslist.txt")是错误的用法:URL(string:)适用于创建网络URL或绝对路径的本地URL,而app bundle内的资源文件必须通过Bundle.main.url(forResource:withExtension:)来获取正确的路径,否则会返回nil,后续的强制解包会导致崩溃。
内容的提问来源于stack exchange,提问作者La Ciste
相关产品推荐
相关产品推荐

