2016-01-26 12 views
6

L'ho visto, ma non riesco a capirlo. In qualche modo, apparentemente magicamente, alcune funzioni infix funzionano bene, ma altre semplicemente non verranno compilate. Per esempio:Come si scrivono le funzioni di Infix Swift?

A function named "*" works fine, but one named "then" does not.

Come vedete qui, il mio lavoro then funzione come funzione tradizionale, ma non come un infisso uno, eppure la mia * si ha il problema opposto. Qual è la salsa magica per ottenere la mia funzione then come infissa?

Domanda laterale: Perché la mia funzione * non funziona come una funzione tradizionale?


Codice in solo testo lettori e copia-incolla:

public func * (let left:String, let right:Int) -> String { 
    if right <= 0 { 
     return "" 
    } 

    var result = left 
    for _ in 1..<right { 
     result += left 
    } 

    return result 
} 
*("Left", 6) // error: '*' is not a prefix unary operator 
"Left" * 6 // "LeftLeftLeftLeftLeftLeft" 

public func then (let left:String, let _ right:String) -> String { 
    return left + right 
} 
then("Left", "Right") // "LeftRight" 
"Left" then "Right" // 2 errors: Consecutive statements on a line must be separated by ';' 
+1

Vorrei suggerire di dare un'occhiata qui https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AdvancedOperators.html agli operatori infissi. –

risposta

6

La libreria standard Swift definisce già * come un operatore infisso:

infix operator * { 
    associativity left 
    precedence 150 
} 

Troverete un elenco degli operatori predefiniti nello Swift Standard Library Operators Reference. In alternativa, "comando-clic" sulla dichiarazione import Swift in Xcode e cercare "operatore".

Per utilizzare un operatore in una chiamata di funzione "tradizionale", è necessario racchiuderlo tra parentesi:

(*)("Left", 6) 

Se si vuole definire il proprio operatore infisso, è necessario aggiungere una dichiarazione infix operator. Si noti tuttavia che solo un set limitato di caratteri è valido per gli operatori (vedere Language Reference->Lexical Structure->Operators per le regole precise). In particolare, un nome operatore deve (come già detto @dfri) iniziare con /, =, -, +,!, *,%, ,>, &, |, ^,?, ~, O qualche altro " simbolo "caratteri. In particolare, "then" non è un nome operatore valido.

+1

Ottima risposta. Dove nel lib standard Swift sono dichiarati questi operatori infissi? Mi piacerebbe fare attraverso i moduli e dare un'occhiata a come funzionano. – JAL

+1

@ JAL: per le loro dichiarazioni, fare clic su Cmd-'Swift' in' import Swift' in es. un parco giochi. – dfri

+1

@ JAL: ... o qui: https://developer.apple.com/library/ios//documentation/Swift/Reference/Swift_StandardLibrary_Operators/index.html. –

2

* è già definito, nativo, come un operatore infisso binario in Swift:

infix operator * { 
    associativity left 
    precedence 150 
} 

Quindi, qualsiasi funzione della forma func * (... si sarà sovraccaricando questo operatore infisso binario. D'altra parte, se si tenta di utilizzare l'operatore * come prefisso unario operatore, si otterrà l'errore descrittivo che "* non è un prefisso operatore unario", semplicemente in quanto * non esiste in modo nativo come un prefisso operatore.

Si potrebbe naturalmente definire il proprio prefisso operatore *:

prefix operator * { } 
prefix func * (rhs: Int) -> Int { 
    return rhs*rhs 
} 

var a : Int = 2 
var b : Int = *a // 4 

Per avvolgere questo: alcuni operatori esiste nativamente a Swift sia come prefisso e infissa operatori, per esempio-

/* Declared natively in Swift */ 
infix operator - { 
    associativity left 
    precedence 140 
} 

prefix operator - { 
} 

/* Example usage */ 
let a : Int = 2 - 1 // 1, '-' infix operator used 
let b : Int = -1 // -1, '-' prefix operator used 

mentre altri, come *, è solo (nativo) usato come un operatore infisso.

Si noti inoltre che se si vuole definire i propri operatori infissi su misura, i loro nomi consentiti sono vincolate come segue:

operatori personalizzati possono iniziare con uno dei caratteri ASCII /, =, -, + ,!, *,%, ,>, &, |, ^,?, O ~, o uno dei caratteri Unicode definiti nella grammatica di seguito (che includono caratteri dagli operatori matematici , Simboli vari e Simboli di simboli Unicode blocchi, tra gli altri). Dopo il primo carattere, sono ammessi anche i caratteri Unicode .

Da Language Reference - Lexical Structure.