2016-07-03 12 views
1

Ich sah ein Beispiel auf "Pro Swift" Buch.Overload-Operator als generische Funktion

es dem Bediener überlastet, den ersten Parameter "LHS" ist eine Funktion, die T nimmt -> U.

aber "generateRandomNumber" -Funktion Int -> Int

Wie kann es auf Arbeit >> > Betreiber?

Wie funktioniert es?

danke.

import Foundation 
infix operator >>> { associativity left } 
func >>> <T, U, V>(lhs: T -> U, rhs: U -> V) -> T -> V { 
    return { rhs(lhs($0)) } 
} 

func generateRandomNumber(max: Int) -> Int { 
    let number = Int(arc4random_uniform(UInt32(max))) 
    print("Using number: \(number)") 
    return number 
} 
func calculateFactors(number: Int) -> [Int] { 
    return (1...number).filter { number % $0 == 0 } 
} 
func reduceToString(numbers: [Int]) -> String { 
    return numbers.reduce("Factors: ") { $0 + String($1) + " " } 
} 

let combined = generateRandomNumber >>> calculateFactors >>> 
reduceToString 
print(combined(100)) 

Antwort

1

Siehe die Dokumentation zu Generika.

let combined = generateRandomNumber >>> calculateFactors >>> reduceToString 
print(generateRandomNumber.dynamicType) 
print(calculateFactors.dynamicType) 
print(reduceToString.dynamicType) 
print(combined.dynamicType) 
/* 
Int -> Int 
Int -> Array<Int> 
Array<Int> -> String 
Int -> String 
*/ 
+0

ich weiß dies. aber die generische Operatorfunktion nimmt das Argument auf der linken Seite ist T -> U. aber generateRandomNumber ist Int -> Int, kann nicht vom selben Typ sein. –

+0

warum nicht? In diesem Fall T === Int und U === Int, das ist alles .... – user3441734

+0

Kannst du mehr erklären? irgendein Beispiel? Wenn ich versuchte, eine generische Funktion zu erstellen, gebe den gleichen Typ zurück. es tauchte Fehler auf. "kann den Rückgabeausdruck des Typs 'T' nicht in den Rückgabetyp 'U'" umwandeln –

Verwandte Themen