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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:08:06