模糊地使用' init(contentsOfURL:)'在swift 4.1中

时间:2018-04-09 08:04:23

标签: swift

我使用Swift 4.1和XCode 9.3

var upsList = [Any]()

func loadUpsValues () {
    print("loadUpsValues")
    let upsFileAsURL = URL(string: "Upslist.txt")
    //    Original Objective C Call was: NSMutableArray *ListUpsArray = [NSMutableArray arrayWithContentsOfURL:upsFile];
    //
    let upsList = NSArray(contentsOfURL:upsFileAsURL! )
}

我收到错误:Ambiguous use of 'init(contentsOfURL:)' 似乎NSArray的来源来自同一个基础定义:

我有两次:

1 Found this candidate (Foundation.NSArray)
2 Found this candidate (Foundation.NSArray)

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

此错误是因为Swift中不存在[NS(Mutable)Array arrayWithContentsOfURL:];

对于swift,NSArray初始化程序已更改为更加“swifty”,因此它变为:

NSArray(contentsOf:)

here

所以改变你的最后一行,代码应按预期运行,即:

let upsList = NSArray(contentsOf: upsFileAsURL!)

修改

继续@nayem的评论。假设您的文本文件是一组行,您可以将代码更改为无需依赖基于NS的对象,如下所示:

func loadUpsValues () {
    do {
        guard let url = Bundle.main.url(forResource: "Upslist", withExtension: "txt") else { return }

        let data = try String(contentsOf: url)
        let upsList = data.components(separatedBy: NSCharacterSet.newlines)

        ...
    } catch {
        /* handle error */
    }
}

答案 1 :(得分:0)

看看这个解决方案:

您已经声明了一次upsList,为什么再次将其声明为 let 这个解决方案有效。

    var upsList = NSArray()

func loadUpsValues () {
    print("loadUpsValues")
    let upsFileAsURL = URL(string: "Upslist.txt")
    //    Original Objective C Call was: NSMutableArray *ListUpsArray = [NSMutableArray arrayWithContentsOfURL:upsFile];
    //
    upsList = NSArray(contentsOf: upsFileAsURL! ) ?? NSArray()
}