/ / Wartości powiązane z Enum - szybkie, wyliczone

Wartości powiązane z enumem - szybkie, wyliczone

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 № 1

Pytanie 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)})