Какой самый простой способ найти класс kindOf в массиве и заменить его в Swift? - PullRequest
0 голосов
/ 04 мая 2018

Я переезжаю из Obj-C в Свифт и нахожусь на этой стадии поиска самых простых вещей, которые будут трудными.

У меня есть массив models

Мне нужно перебрать models и найти isKindOfClass modelFoo.

Как только тип modelFoo найден, я хочу заменить то, что там, на newModel.

Ответы [ 3 ]

0 голосов
/ 04 мая 2018

Универсальное решение:

struct Foo {
    var name: String
}

struct Bar {
    var name: String
}

struct Baz {
    var name: String
}

//Your array of different models
var models: [Any] = [Foo(name: "Some 1"),
                     Bar(name: "Other 1"),
                     Foo(name: "Some 2"),
                     Bar(name: "Other 2"),
                     Foo(name: "Some 3"),
                     Bar(name: "Other 3")]

//Loop through the array
models = models.map { (model) -> Any in
    if let fooModel = model as? Foo {
        /*
         Testing if model typecasts to Foo.
         If it does then the current iteration is on the Foo model
         */

        //Translate Foo to Baz
        let newModel = Baz(name: "Replaced: \(fooModel.name)")

        return newModel
    }

    //If the above typecast fails, return whatever the current item is
    return model
}

print(models)
0 голосов
/ 04 мая 2018

Если вы хотите изменить свой массив «на месте», вы можете использовать вариант ответа Влада (отлично):

class ModelFoo {}
class NewModel {}

var models: [Any] = [ModelFoo(), NewModel(),ModelFoo(), NewModel()]

models.enumerated().forEach {
    if $0.1 is ModelFoo {
        models[$0.0] = NewModel()
    }
}
0 голосов
/ 04 мая 2018

Возможно, этот код вам поможет (с детской площадки):

class ModelFoo {}
class NewModel {}

let models: [Any] = [ModelFoo(), NewModel()]

let result = models.map { $0 as? NewModel ?? NewModel() }

Вы просто проверяете тип каждого элемента в массиве models и пытаетесь привести этот элемент к типу NewModel. Если вы не можете привести этот элемент к типу NewModel, вы получите nil, который позже будет заменен новым экземпляром NewModel. Итак, в результате вы получите массив с элементами типа NewModel.

OR

Использовать этот код как массив результатов:

let result: [Any] = models.map {
    guard $0 is ModelFoo else { return $0 }
    return NewModel()
}

Разница в том, что вторая реализация поддерживает случай, когда массив models состоит не только из экземпляров ModelFoo и NewModel, и вы хотите заменить только экземпляров ModelFoo и оставить другие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...