как люди справляются с итерацией свойства типа структуры Swift? - PullRequest
0 голосов
/ 03 января 2019

Вот очевидная ситуация, которая должна постоянно возникать у людей:

struct Foundation {
    var columns : [Column] = [Column(), Column()]
}
struct Column : CustomStringConvertible {
    var cards = [Card]()
    var description : String {
        return String(describing:self.cards)
    }
}
struct Card {}
var f = Foundation()
for var c in f.columns {
    c.cards.append(Card())
}

Этот код допустим, но, конечно, он не влияет на f, потому что var c все еще является копией - фактическое columns из f не затронуто.

У меня нет проблем с пониманием , почему это происходит. Мой вопрос в том, что люди обычно делают .

Ясно, что я могу просто уйти от всего этого, объявив столбец class вместо struct , но так ли это обычно делают люди? (Я пытаюсь следовать ментальной строгости, что следует избегать занятий, когда нет необходимости в динамическом распределении / полиморфизме / создании подклассов; возможно, я слишком далеко захожу, или, может быть, есть что-то, что обычно делают другие люди, например, inout как-то.)

1 Ответ

0 голосов
/ 03 января 2019

Начиная с Swift 4, компромисс заключается в переборе индексов изменяемой коллекции вместо самих элементов, так что

for elem in mutableCollection {
    // `elem` is immutable ...
}

или

for var elem in mutableCollection {
   // `elem` is mutable, but a _copy_ of the collection element ...
}

становится

for idx in mutableCollection.indices {
    // mutate `mutableCollection[idx]` ...
}

В вашем примере:

for idx in f.columns.indices {
   f.columns[idx].cards.append(Card()) 
}

Как указал @Hamish в комментариях, в будущей версии Swift может быть реализована мутирующая итерация , в результате чего

for inout elem in mutableCollection {
   // mutate `elem` ...
}

возможно.

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