首页 > 解决方案 > Swift:类数组的问题

问题描述

我正在尝试创建一个包含两项的数组:一个 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 属性有效。简而言之,如何在我的数组中设置特定属性?

标签: arraysswiftcore-graphics

解决方案


有很多问题。

  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()可能会崩溃。考虑适当的解决方案。


推荐阅读