2015-03-12 12 views
5

Ho un:Swift, variabile con stesso nome di un metodo

var formVC:UIViewController! 

Sto anche cercando di avere una funzione denominata:

func formVC()->UIViewController{....} 

conosco in objc ha funzionato, ma io Non vedo un modo per farlo in Swift. C'è un modo per farlo, o non sto capendo un ovvio cambiamento architettonico/concettuale in Swift?

Grazie in anticipo.

risposta

5

Questa è stata una cattiva idea in ObjC, ed è illegale in Swift. Prendi in considerazione alcuni di questi casi:

class X { 
    var value : Int = 0 
    func value() -> Int { return 1 } 
} 
let x = X() 

Che cos'è x.value in questo caso? È Int o è () -> Int? È legale e utile trattare i metodi delle classi come se fossero delle chiusure.

Che cosa succede se siamo ancora più difficile, e fare questo:

class X { 
    let value:() -> Int = { 2 } 
    func value() -> Int { return 1 } 
} 
let x = X() 
let v = x.value() // ???? 

Qualora Swift utilizzare la proprietà value e poi lo chiamano? O dovrebbe chiamare il metodo value()? Le chiusure sono completamente legali come proprietà.

La stessa restrizione esiste effettivamente in ObjC. Non è stato possibile creare una proprietà sintetizzata che fosse in conflitto con un metodo (se avessero tipi diversi, se avessero avuto lo stesso tempo, ObjC non avrebbe sintetizzato in silenzio l'accessor). Stai pensando alle proprietà di Swift come se fossero equivalenti agli Ivar di ObjC, ma non è giusto. Le proprietà di Swift sono equivalenti alle proprietà dell'ObjC (ovvero i metodi che accedono a ivars). Non hai accesso agli Ivars sottostanti in Swift.

2

In Swift, non è possibile assegnare un nome a una variabile e una funzione la stessa cosa se non vengono passati parametri. Sebbene li chiamiamo in modi diversi (foo per una variabile e foo() per una funzione) otterremo una ridichiarazione di foo non valida. Il compilatore tratta la variabile come se non avesse parametri come la funzione. Tuttavia, usando i parametri, puoi nominare una funzione e una variabile la stessa cosa, anche se ti consiglierei di non farlo. In questo caso dovresti provare a nominare la variabile e la funzione qualcosa che descrive cosa sono e/o cosa fanno per rendere il tuo codice più leggibile da altri. Suggerirei di nominare la variabile qualcosa come formViewController e la funzione qualcosa come createFormViewController.

var foo = 0 

func foo() {} // Error: Invalid redeclaration of foo 

func foo(string: String) {} // No error 

e se si utilizza solo la funzione per impostare la variabile, l'uso calcolato proprietà invece:

lazy var formViewController: UIViewController! { 
    return UIViewController() 
} 
+1

Si dovrebbe comunque evitare il nome 'getFormViewController'. Un "get" leader viola ancora KVC e Swift è ancora soggetto a KVC. Ma hai ragione che dovresti usare un nome migliore per il metodo. –

Problemi correlati