2015-06-04 12 views
5

Stavo lavorando su un tutorial Swift e ho scoperto che Swift ha uno strano modo di gestire l'istruzione multilinea.Dichiarazione multilinea in Swift

In primo luogo, ho definito alcune estensione alla String classe standard:

extension String { 
    func replace(target: String, withString: String) -> String { 
     return self.stringByReplacingOccurrencesOfString(target, withString: withString) 
    } 

    func toLowercase() -> String { 
     return self.lowercaseString 
    } 
} 

Questo funziona come previsto:

let str = "HELLO WORLD" 
let s1 = str.lowercaseString.replace("hello", withString: "goodbye") // -> goodbye world 

Questo non funziona:

let s2 = str 
      .lowercaseString 
      .replace("hello", withString: "goodbye") 
// Error: could not find member 'lowercaseString' 

Se io sostituire il riferimento alla proprietà lowercaseString con una chiamata di funzione, funziona di nuovo :

let s3 = str 
      .toLowercase() 
      .replace("hello", withString: "goodbye") // -> goodbye world 

C'è qualcosa nelle specifiche del linguaggio Swift che impedisce a una proprietà di essere interrotta su una propria linea?

Codice a Swift Stub.

risposta

4

Questo è sicuramente un bug del compilatore. Il problema è stato risolto in Xcode 7 beta 3.

0

L'utilizzo del punto e virgola non è obbligatorio in swift. E penso che i problemi con le istruzioni multilinea in swift siano dovuti al punto e virgola opzionale.

Si noti che swift non supporta stringhe multilinea. Controlla qui: Swift - Split string over multiple lines

Quindi forse swift non può gestire istruzioni multilinea. Non sono sicuro di questo e questo potrebbe essere uno dei motivi, quindi sarei grato se qualcun altro può aiutare per quanto riguarda questo problema.

2

Questo sembra un errore del compilatore, ma si riferisce al fatto che è possibile definire operatori prefisso, infisso e suffisso in Swift (ma non l'operatore., Ironicamente). Non so perché ti dà solo dolore sulla proprietà e non sulla funzione, ma è una combinazione di due cose:

  • lo spazio bianco prima e dopo il. (punto) operatore per proprietà (solo)
  • alcune sfumature di questo linguaggio in continua crescita che tratta le proprietà in modo diverso rispetto alle chiamate di funzione (anche se le funzioni sono supposte per i tipi di prima classe).

Vorrei inserire un bug per vedere cosa ne viene fuori, Swift non è previsto da pythonic in questo modo. Detto questo, per ovviare a questo problema, è possibile non rompere la proprietà dal tipo, oppure è possibile aggiungere uno spazio bianco prima e dopo lo ..

let s2 = str.lowercaseString 
    .replace("hello", withString: "goodbye") 

let s3 = str 
    . lowercaseString 
    .replace("hello", withString: "goodbye")