Próbuję zrozumieć Enum Swifta. Chcę przypisać mój enum case skojarzoną wartość i zwrócić zwróconą wartość obliczeniową. Obecnie używam metody zwracania obliczonej liczby.
enum Calculation {
case Number1(number: Int)
case Number2(number: Int)
func calculation() -> Int {
switch self {
case Number1(let number): return number + 1
case Number2(let number): return number + 2
}
}
}
Zastanawiałem się, czy można to zrobić krótko, jak:
// This obviously doesn"t work. Just an example as what I"m trying to achieve
enum Calculation: Int {
case Number1(number: Int): return number + 1
case Number2(number: Int): return number + 2
}
Odpowiedzi:
2 dla odpowiedzi № 1Pytanie brzmi, czy chcesz użyć zmiennej obliczeniowej:
enum Calculation {
case Number1(number: Int)
case Number2(number: Int)
var value:Int {
switch self {
case Number1(let number): return number + 1
case Number2(let number): return number + 2
}
}
}
Lub wartość zapisaną jako wartość powiązana:
enum CalculationType {
case Number1, Number2
}
enum Calculation {
case Number1(number: Int)
case Number2(number: Int)
init (type:CalculationType, number:Int) {
switch type {
case .Number1:
self = Calculation.Number1(number: number + 1)
case .Number2:
self = Calculation.Number2(number: number + 2)
}
}
}
Twoje pytanie wskazuje na byłego, ale jestem "nie wynika z drugiego fragmentu kodu, czy oczekiwałeś tego drugiego, czy też miałeś nadzieję, że inicjalizacja zwróci wartość, która nie może się wydarzyć ( init
nie zwraca wartości). Najbliższą rzeczą byłoby posiadanie funkcji statycznej:
enum CalculationType {
case Number1, Number2
}
enum Calculation {
case Number1(number: Int)
case Number2(number: Int)
static func calc(type:CalculationType, number:Int) -> (Calculation, Int) {
switch type {
case .Number1:
return (Calculation.Number1(number: number), number + 1)
case .Number2:
return (Calculation.Number2(number: number), number + 2)
}
}
}
Calculation.calc(.Number1, number: 2)
Alternatywnie możesz użyć wywołania zwrotnego na init
:
enum CalculationType {
case Number1, Number2
}
enum Calculation {
case Number1(number: Int)
case Number2(number: Int)
init (type:CalculationType, number:Int, callback:(Int) -> Void) {
switch type {
case .Number1:
self = Calculation.Number1(number: number)
callback(number + 1)
case .Number2:
self = Calculation.Number2(number: number)
callback(number + 2)
}
}
}
Calculation(type: .Number1, number: 10, callback: {n in print(n)})