Swift: проблемы с массивами классов - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь создать массив из двух элементов: URL-адреса и строки. Индекс элементов имеет значение.

Данные взяты из QuartzFilterManager, который предоставляет информацию о кварцевых фильтрах, установленных в системе.

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метод добавленияНо свойство name в предыдущей строке работает. Короче говоря, как мне установить определенные свойства в моем массиве?

Ответы [ 2 ]

1 голос
/ 05 октября 2019

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: будьте осторожны с ! в swift, если этоиспользуется на что-то, что случается, ноль будет сбой приложения. Подробнее об опциях здесь

PpPs: я опоздал всего на несколько минут: D

1 голос
/ 05 октября 2019

Есть много проблем.

  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() может привести к сбою. Обдумайте правильные решения.

...