Меня удивляет, что Swift 2 (начиная с бета-версии 2) не затрагивает этого. Ниже приведен пример обходного подхода:
enum TestAssociatedValue {
case One(Int)
case Two(String)
case Three(AnyObject)
func associatedValue() -> Any {
switch self {
case .One(let value):
return value
case .Two(let value):
return value
case .Three(let value):
return value
}
}
}
let one = TestAssociatedValue.One(1)
let oneValue = one.associatedValue() // 1
let two = TestAssociatedValue.Two("two")
let twoValue = two.associatedValue() // two
class ThreeClass {
let someValue = "Hello world!"
}
let three = TestMixed.Three(ThreeClass())
let threeValue = three. associatedValue() as! ThreeClass
print(threeValue.someValue)
Если ваше перечисление смешивает случаи со связанными значениями и без них, вам нужно сделать тип возвращаемого значения необязательным. Вы также можете возвращать литералы для некоторых случаев (которые не имеют связанных значений), имитируя типизированные перечисления с необработанным значением. И вы даже можете вернуть значение enum для несвязанных, не-сырых типов. Например:
enum TestMixed {
case One(Int)
case Two(String)
case Three(AnyObject)
case Four
case Five
func value() -> Any? {
switch self {
case .One(let value):
return value
case .Two(let value):
return value
case .Three(let value):
return value
case .Four:
return 4
case .Five:
return TestMixed.Five
}
}
}
let one = TestMixed.One(1)
let oneValue = one.value() // 1
let two = TestMixed.Two("two")
let twoValue = two.value() // two
class ThreeClass {
let someValue = "Hello world!"
}
let three = TestMixed.Three(ThreeClass())
let threeValue = three.value() as! ThreeClass
print(threeValue.someValue)
let four = TestMixed.Four
let fourValue = four.value() // 4
let five = TestMixed.Five
let fiveValue = five.value() as! TestMixed
switch fiveValue {
case TestMixed.Five:
print("It is")
default:
print("It's not")
}
// Prints "It is"
Теперь мне нужно получить все группы, членом которых является пользователь.
blockquote>Для этого я рекомендую вам использовать структуру базы данных, которая выглядит так:
Firestore-root | --- group_members (collection) | --- uid (document) | --- user_groups (map) | --- group_id: true | --- group_id: true
Чтобы запросить эту структуру, используйте следующие строки кода:
Для Android:
FirebaseFirestore rootRef = FirebaseFirestore.getInstance(); DocumentReference uidRef = rootRef.collection("group_members").document(uid); uidRef.get().addOnCompleteListener(/* ... */);
Для Kotlin:
val rootRef = FirebaseFirestore.getInstance() val uidRef = rootRef.collection("group_members").document(uid) uidRef.get().addOnCompleteListener(/* ... */)
В итоге просто перебираем по карте
user_groups
и получаем все группы, в которые пользователь входит.