Swift:类 的数组有问题

Swift: trouble with Arrays of classes

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

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

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 抱怨类型 URL 没有附加方法。但是前一行中的名称 属性 有效。简而言之,如何在数组中设置特定属性?

有很多问题。

  1. 使 myFilter 成为结构而不是 class 并将其正确命名为 MyFilter.
  2. 你永远不会初始化你的filterArray,你只是声明它。
  3. 您需要为要添加到数组的每个 url/name 对创建一个 MyFilter 的新实例。
  4. 在这种情况下您不需要使用 enumerated
  5. 您的 getFilter 函数的 return 类型错误(我认为)。
  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
}

还是不太理想。必须使用 as! QuartzFilter 转换 eachFilter 很笨拙。

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

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 编写,变量以 驼峰式)

PpS:小心 ! in swift,如果它被用在恰好为 nil 的东西上,应用程序会崩溃。阅读更多关于选项 here

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