0

我正在尝试创建一个包含两项的数组:一个 URL 和一个字符串。项目的索引很重要。

数据取自 QuartzFilterManager,它提供有关安装在系统上的 Quartz Filters 的信息。

import Cocoa
import Quartz

class myFilter {
    var myURL: URL?
    var name: String = ""
}

func getFilters() -> Array<String> {
    var filterArray: Array<myFilter>
    if let Filters = QuartzFilterManager.filters(inDomains: nil) {

        for (index, eachFilter) in Filters.enumerated() {
            filterArray[index].name.append((eachFilter as! QuartzFilter).localizedName()!)
            filterArray[index].myURL!.append((eachFilter as! QuartzFilter).url()!)
            }
    }
}

Xcode 抱怨 Type URL 没有 append 方法。但是前一行中的 name 属性有效。简而言之,如何在我的数组中设置特定属性?

4

2 回答 2

1

有很多问题。

  1. myFilter创建一个结构而不是类,并将其正确命名为MyFilter.
  2. 你从不初始化你的filterArray,你只声明它。
  3. 您需要为MyFilter要添加到数组的每个 url/名称对创建一个新实例。
  4. enumerated在这种情况下你不需要使用。
  5. 您的getFilter函数的返回类型错误(我认为)。
  6. 使用正确的命名约定。

这是清理后的代码:

struct MyFilter {
    var myURL: URL?
    var name: String
}

func getFilters() -> [MyFilter] {
    var filterArray = [MyFilter]()
    if let filters = QuartzFilterManager.filters(inDomains: nil) {
        for eachFilter in filters {
            let filter = MyFilter(myURL: (eachFilter as! QuartzFilter).url(), name: (eachFilter as! QuartzFilter).localizedName()!)
            filterArray.append(filter)
        }
    }

    return filterArray
}

它仍然不理想。不得不eachFilter使用as! QuartzFilter是笨重的。

和其他用途!都不好。强制展开调用localizedName()可能会崩溃。考虑适当的解决方案。

于 2019-10-05T17:48:55.943 回答
1

Append 是数组结构的方法,而不是 URL/String 的方法。

  1. 您首先需要创建数组(您刚刚声明了它,实际上您需要为它分配一些东西)
  2. 然后,您需要创建要附加到数组中的对象
  3. 您现在可以将这个新创建的对象附加到数组中

它应该看起来像这样:

import Cocoa
import Quartz

class MyFilter {
    var myURL: URL?
    var name: String?

    init(url: URL?, name: String?) {
        self.myURL = url
        self.name = name
    }
}

func getFilters() -> Array<MyFilter> {
    var filterArray = [MyFilter]()
    if let filters = QuartzFilterManager.filters(inDomains: nil) {

        for filter in filters {
            let aFilter = MyFilter(url: filter.url(), name: filter.localizedName())
            filterArray.append(aFilter)
        }
    }
    return filterArray
}

现在这个方法返回的数组将有 N 个 MyFilter 对象。您可以像以前一样访问数组中的每个对象,使用

let aFilter = filterArray[index]

并获取该对象内部的属性:

let url = aFilter.myURL
let name = aFilter.name

PS:我更改了一些名称以适应 swift 约定(类用PascalCase编写,变量用camelCase编写)

PpS:小心很快,如果它用于碰巧为 nil 的东西会使应用程序崩溃。在此处阅读有关选项的更多信息

PpPs:我只是迟到了几分钟:D

于 2019-10-05T18:04:36.187 回答