Swift — перебирать все случаи вложенного перечисления

#swift #enums

#быстрый #перечисления

Вопрос:

У меня есть следующая настройка вложенного перечисления:

 enum UserSettings:Equatable {
    case emailSettings(EmailSettings), notificationSettings(NotificationSettings), socialSettings(SocialSettings), gameSettings(GameSettings)

    enum EmailSettings:CaseIterable {
        case enableEmails, allowPromotionalEmails
    }

    enum NotificationSettings:CaseIterable {
        case enableAppNotifications, getNewFollowerNotifications, getTaggedInPostNotifications
    }

    enum SocialSettings:CaseIterable {
        case allowChallengeInvites, allowCrewRequests, allowLeagueInvites, allowPostTagging, allowUsersToFollow, appearOffline, crewOnlyMessaging, matchesArePublic, profileIsPublic
    }

    enum GameSettings:CaseIterable {
        case syncNewMatchesOnStartup
    }
}
 

Я пытаюсь передать значение «UserSettings» в ячейку с cellForRowAt помощью следующего кода:

 let cell = settingsTableView.dequeueReusableCell(withIdentifier: "yesNoSettingsCell", for: indexPath) as! YesNoSettingsCell
let currentSetting = UserSettings.SocialSettings.allCases[indexPath.row]
cell.passedUserSetting = currentSetting
return cell
 

Приведенный выше код выдает следующую ошибку:

 "Cannot assign value of type 'UserSettings.SocialSettings' to type 'UserSettings'"
 

Изменение кода в cellForRowAt :

 let currentSetting = UserSettings.socialSettings().allCases[indexPath.row]
 

выдает следующую ошибку:

 "Missing argument for parameter #1 in call"
 

Что я упускаю из виду? Как мне перечислить все случаи вложенного перечисления?

Комментарии:

1. let currentSetting = UserSettings.SocialSettings.allCases[indexPath.row]; cell.passedUserSetting = .socialSettings(currentSetting) ?

2. cell.passedUserSetting = UserSettings.socialSettings(currentSetting) тогда? Обратите внимание, что в предыдущем не должно быть пробела .socialSettings (currentSetting) => .socialSettings(currentSetting) , но я думаю, вы исправили эту опечатку

3. Это сделало это! Спасибо! Убедитесь, что вы добавили ответ, чтобы я мог его принять.

Ответ №1:

Ошибка "Cannot assign value of type 'UserSettings.SocialSettings' to type 'UserSettings'" включена cell.passedUserSetting = currentSetting . Вы даете контекст, но passedUserSetting это UserSettings .

Но когда вы это сделаете:

 let currentSetting = UserSettings.SocialSettings.allCases[indexPath.row]
 

Итак, это означает currentSetting , что это a UserSettings.SocialSettings .

Итак, вы пытаетесь установить значение типа B на ожидаемое значение типа A. Это не сработает.

Вы можете иметь при себе перечисление a UserSettings с a UserSettings.SocialSettings :

 cell.passedUserSetting = .socialSettings(currentSetting)