Написание нескольких вложенных для ... в циклах в Swift - PullRequest
2 голосов
/ 08 апреля 2019

Есть ли более аккуратный или лучший способ написать ниже вложенные для ... в циклах в Swift, пожалуйста? Или используется для ... даже правильного способа заполнения моих карт?

for cardNumber in 1...3 {
    for cardSymbolIdentifier in 1...3 {
        for cardColorIdentifier in 1...3 {
            for cardShadingIdentifier in 1...3 {
                let card = Card(cardNumber: cardNumber, cardSymbolIdentifier: cardSymbolIdentifier, cardColorIdentifier: cardColorIdentifier, cardShadingIdentifier: cardShadingIdentifier)
                deckOfCards.append(card)
            }
        }
    }
}

Это определенно делает свою работу, но я не могу найти ничего в документации по написанию нескольких вложенных циклов.

Большое спасибо заранее, Andy

Ответы [ 2 ]

2 голосов
/ 08 апреля 2019

Нет ничего плохого в ваших циклах for.Они отличные, хорошо написанные Swift.Единственная проблема с вашим кодом заключается в том, что он deckOfCards является изменяемым (var), что может быть нежелательным.Если бы это было так, вы могли бы использовать map, но я не считаю это особенно лучшим Swift, просто немного по-другому.

let d = (1...3).flatMap { number in
    (1...3).flatMap { symbol in
        (1...3).flatMap { color in
            (1...3).map { shading in
                Card.init(cardNumber: number,
                          cardSymbolIdentifier: symbol,
                          cardColorIdentifier: color,
                          cardShadingIdentifier: shading
                )}}}}

Я бы вероятно написал бы это вторым способом, но только по стилистическим соображениям.Ваши циклы for абсолютно нормальны.


Примечание @ user28434 Комментарий ниже.В моей оригинальной версии была серьезная ошибка (возвращался неверный тип).Я пишу Swift с того дня, как он был выпущен.Я учу Свифта.Я преподаю функциональное программирование в Swift.И я облажался, когда писал на лету.Я бы никогда не сделал эту ошибку с простым циклом for.Там есть главный урок.

0 голосов
/ 08 апреля 2019

Ваш код вообще не имеет проблем с оптимизацией в зависимости от необходимости, но вы можете сделать его немного более элегантным или быстрым (: p)

let values = [1,2,3]

values.forEach { (cardNumber) in
    values.forEach { (cardSymbolIdentifier) in
        values.forEach { (cardColorIdentifier) in
            values.forEach { (cardShadingIdentifier) in

                let card = Card(cardNumber: cardNumber, cardSymbolIdentifier: cardSymbolIdentifier, cardColorIdentifier: cardColorIdentifier, cardShadingIdentifier: cardShadingIdentifier)
                deckOfCards.append(card)
            }
        }
    }
}   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...