2015-06-04 11 views
35

Nuovo per la programmazione IOS, ma mi chiedo solo dove è il posto migliore dove mettere le funzioni che vorrei usare nel mio codice. Ad esempio, desidero scrivere alcune funzioni per eseguire una richiesta POST a un servizio Web e restituire un dizionario. Forse un'altra funzione per fare alcuni calcoli. È meglio creare un altro file .swift e inserire tutte le mie funzioni lì. E quale sarebbe un buon nome dare il file se è così?Dove mettere le funzioni riutilizzabili in IOS Swift?

public func postRequest() -> [String:String] { 
    // do a post request and return post data 
    return ["someData" : "someData"] 
} 
+1

Creare un file swift separato e inserire tutte le funzioni in questo. Puoi usarlo per tutto il codice. – Kapil

risposta

57

Il modo migliore è quello di creare una classe di supporto con funzioni statiche, in questo modo:

class Helper{ 
    static func postRequest() -> [String:String] { 
     // do a post request and return post data 
     return ["someData" : "someData"] 
    } 
} 

Ora, ogni volta che è necessario utilizzare postRequest si può semplicemente utilizzare in questo modo: Helper.postRequest()

Spero che ti aiuti!

+0

Grazie! Quindi chiamarlo semplicemente Helper.swift sarebbe una buona pratica? –

+4

Normalmente ho molti helper quindi vorrei avere AnimationHelper.swift, CoreDataHelper.swift e così via, prova a spezzare le tue classi di helper separate dal lavoro che fa – Icaro

+0

Sarebbe func postRequest() avere bisogno di essere una funzione statica postRequest() in ordine chiamarlo usando Helper.postRequest()? xCode mi sta dicendo così. –

2

Generalmente creo una classe separata se ho funzioni che verranno utilizzate da più classi, in particolare per quelle che riguardano le operazioni di rete.

Se v'è solo funzioni distinte che verranno utilizzati, si può semplicemente creare funzioni statiche all'interno di quella classe ed è quindi facilmente raggiungibile in altre classi in modo statico:

class DataController { 
    static func getData() -> [String:String] { 
     // do some operations 
     return ["someData" : "someData"] 
    } 
} 

let data = DataController.getData() // example 

Tuttavia, ciò che spesso è stato il caso per me (specialmente se comporta operazioni più complicate) era che queste operazioni di rete dovevano stabilire in anticipo una connessione iniziale o richiedere alcune impostazioni iniziali, e anche eseguire operazioni asincrone che dovevano essere controllate. Se questo è il caso e spesso chiamerai questi metodi, potresti voler creare un oggetto singleton che potresti usare in diverse classi e funzioni. In questo modo, è possibile eseguire la configurazione iniziale o stabilire una connessione iniziale una sola volta, quindi eseguire il resto secondo le necessità con le altre funzioni, invece di eseguirle ogni volta che viene chiamata la funzione.

Creazione di un oggetto Singleton è piuttosto semplice a Swift:

class DataController { 
    static let sharedInstance = DataController() // singleton object 

    init() { 
     // do initial setup or establish an initial connection 
    } 

    func getData() -> [String:String] { 
     // do some operations 
     return ["someData" : "someData"] 
    } 
} 

let data = DataController.sharedInstance.getData() // example 

Per il nome della classe, di solito il nome è qualcosa come DataController o DataHelper, ma tutto ciò che ha senso come classe "aiuto" sarebbe lavoro.

Spero che questo aiuti :)

3

Per le funzioni riutilizzabili dipende da cosa ho deciso di usare. Per questo caso specifico, utilizzo un file separato, perché la pubblicazione su un back-end diventerà più complicata quando l'applicazione si evolverà. Nella mia app che uso una classe backend, con tutti i tipi di classi di supporto:

struct BackendError { 
    var message : String 
} 

struct SuccessCall { 
    var json : JSON 

    var containsError : Bool { 
     if let error = json["error"].string { 
      return true 
     } 
     else { 
      return false 
     } 

    } 
} 

typealias FailureBlock = (BackendError) -> Void 
typealias SuccessBlock = (SuccessCall) -> Void 

typealias AlamoFireRequest = (path: String, method: Alamofire.Method, data: [String:String]) -> Request 
typealias GetFunction = (path: String , data: [String : String], failureBlock: FailureBlock, successBlock: SuccessBlock) -> Void 

class Backend { 
    func getRequestToBackend (token: String)(path: String , data: [String : String], failureBlock: FailureBlock, successBlock: 

} 

Per gli altri casi spesso utilizzare le estensioni sulle classi Swift. Piace ottenere un elemento casuale da una matrice.

extension Array { 
    func sampleItem() -> T { 
     let index = Int(arc4random_uniform(UInt32(self.count))) 
     return self[index] 
    } 
} 
+0

questo sembra abbastanza bello. Hai un'app campione di soe? Sono un principiante e mi sarebbe di grande aiuto. – bruno

0

È possibile creare una classe separata rapida, potrebbe nominarlo WebServicesManager.swift, e scrivere tutti i metodi relativi a richieste web in esso.

È possibile utilizzare i metodi di classe o il modello singleton per accedere ai metodi.

Problemi correlati