2015-07-05 5 views
6

Ich möchte eine generische Hilfsfunktion erstellen, die einige Verarbeitung ausführt. Eine seiner Eingaben wird eine Funktion sein, die ein Array von etwas zurückgibt.Argument für generischen Parameter 'T' konnte nicht abgeleitet werden

Ich kann nicht herausfinden, wie das geht. Ich bekomme immer einen Kompilierungsfehler. Ich fand den Beitrag

argument for generic parameter could not be inferred

und versuchte das Hinzufügen ...as [String] oder ... as [Int], etc., aber kein Glück.

func helperThatDoesSomeGenericProcessing<T>(displayedStrings:() -> [T]) -> [String]! { 
    let listOfSomething: [T] = displayedStrings() 
    // do something with listOfSomething 
    return ["some", "resulting", "string", "from", "the", "input"] 
} 

func concreteFunction1() -> [AnyObject]! { 
    var s: [String] = helperThatDoesSomeGenericProcessing { // ERROR: Argument for generic parameter 'T' could not be inferred. 
     var str = ["One", "Two", "Three"] 
    } // tried 'as [String]' here 

    // do something with s 
    return s 
} 

func concreteFunction2() -> [AnyObject]! { 
    var s: [Int] = helperThatDoesSomeGenericProcessing { // ERROR: Argument for generic parameter 'T' could not be inferred. 
     var i = [1, 2, 3] 
    } // tried 'as [Int]' here 

    // do something with s 
    return s 
} 
+0

Was versuchst du genau zu tun? Das ist ziemlich verwirrend, ohne genauere Angaben darüber zu haben, was für eine Art von Verarbeitung Sie gerade versuchen ... weil es ein bisschen wie ein XY-Problem aussieht. – nhgrif

Antwort

5

return entsprechend Hinzufügen und ausdrücklich die konkrete Art der () -> [T] erklärt die Fehler lösen ... aber ich bin nicht sicher, es wird Sie bekommen, was Sie wollen. Auf jeden Fall hier ist der Code:

func helperThatDoesSomeGenericProcessing<T>(displayedStrings:() -> [T]) -> [String]! { 
    let listOfSomething: [T] = displayedStrings() 
    // do something with listOfSomething 
    return ["some", "resulting", "string", "from", "the", "input"] 
} 

func concreteFunction1() -> [AnyObject]! { 
    var s: [String]! = helperThatDoesSomeGenericProcessing { 
     () -> [String] in // Explicit declared type 
     var str = ["One", "Two", "Three"] 
     return str 
    } // tried 'as [String]' here 

    // do something with s 
    return s 
} 

func concreteFunction2() -> [AnyObject]! { 
    var s: [String]! = helperThatDoesSomeGenericProcessing { 
     () -> [Int] in // Explicit declared type 
     var i = [1, 2, 3] 
     return i 
    } // tried 'as [Int]' here 

    // do something with s 
    return s 
} 

Hinweis korrigierte ich auch die Art der var s da Ihre generische Funktion liefert immer eine implizit ungeöffneten optionales Array von Strings [String]!. Der Rückgabetyp ist nicht verallgemeinert (d.h. T oder [T] usw.).

Wahrscheinlich müssen Sie möglicherweise einige Typdeklarationen ändern, um Ihre Designanforderungen zu erfüllen.

Hoffe das hilft

+0

Perfekt! Vielen Dank. – Daniel

0

hallo Ihr Verschlusskörper hat keine Rückkehr

func concreteFunction1() -> [AnyObject]! { 
    let s: [String] = helperThatDoesSomeGenericProcessing { // ERROR: Argument for generic parameter 'T' could not be inferred. 
    return ["One", "Two", "Three"] 
} // tried 'as [String]' here 

    // do something with s 
    return s 
} 
+0

Das scheint immer noch nicht das Problem zu beheben. Ich bekomme immer noch den gleichen Fehler. – Daniel

Verwandte Themen