2015-06-04 9 views
35

Neu bei der IOS-Programmierung, aber ich frage mich nur, wo ich am besten bin, um Funktionen zu platzieren, die ich in meinem Code verwenden würde. Zum Beispiel möchte ich ein paar Funktionen schreiben, um eine POST-Anfrage an einen Web-Service durchzuführen und ein Wörterbuch zurückzugeben. Vielleicht eine andere Funktion, um einige Berechnungen durchzuführen. Ist es am besten, eine andere SWIFT-Datei zu erstellen und alle meine Funktionen dort zu platzieren. Und was wäre ein guter Name, um die Datei zu geben, wenn ja?Wohin mit wiederverwendbaren Funktionen in IOS Swift?

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

Erstellen Sie eine separate swift-Datei, und fügen Sie alle diese Funktionen hinzu. Sie können das im gesamten Code verwenden. – Kapil

Antwort

57

Der beste Weg ist es, eine Hilfsklasse mit statischen Funktionen zu erstellen, wie folgt aus:

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

Nun jedes Mal, wenn Sie brauchen postRequest verwenden, können Sie wie so verwenden: Helper.postRequest()

Ich hoffe das hilft dir!

+0

Danke! Also einfach nur die Benennung von Helper.swift wäre ok Übung? –

+4

Ich habe normalerweise viele Helfer, also würde ich AnimationHelper.swift, CoreDataHelper.swift und so weiter haben, versuchen Sie, Ihre Hilfsklassen zu trennen, getrennt durch den Job, den es tut – Icaro

+0

Würde func postRequest() ein statischer func postRequest() sein müssen um es mit Hilfe von Helper.postRequest() aufzurufen? xCode sagt es mir. –

2

Ich erstelle normalerweise eine separate Klasse, wenn ich Funktionen habe, die von mehreren Klassen verwendet werden, insbesondere für diejenigen, die Netzwerkoperationen beinhalten.

Wenn Sie nur getrennte Funktionen haben, die verwendet werden, können Sie einfach statische Funktionen innerhalb dieser Klasse schaffen, so dass es leicht mit anderen Klassen in einer statischen Weise:

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

let data = DataController.getData() // example 

jedoch bisher oft Der Fall für mich (besonders wenn es kompliziertere Operationen betrifft) war, dass diese Netzwerkoperationen im Voraus eine erste Verbindung herstellen mussten oder einige initiale Setups erforderten, und sie führten auch asynchrone Operationen durch, die kontrolliert werden mussten. Wenn dies der Fall ist und Sie häufig solche Methoden aufrufen, möchten Sie möglicherweise ein Singleton-Objekt erstellen, das Sie in verschiedenen Klassen und Funktionen verwenden können. Auf diese Weise können Sie die Ersteinrichtung vornehmen oder nur einmal eine erste Verbindung herstellen und dann den Rest bei Bedarf mit den anderen Funktionen ausführen, anstatt sie bei jedem Aufruf der Funktion auszuführen.

ein Singleton-Objekt zu erstellen ist recht einfach in 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 

Für den Namen der Klasse, ich nenne es in der Regel so etwas wie DataController oder DataHelper, aber alles, was Sinn als „Helfer“ Klasse macht würde Arbeit.

this helps :)

3

Für wiederverwendbare Funktionen hängt es, was ich zu verwenden entscheiden. Für diesen speziellen Fall verwende ich eine separate Datei, da die Veröffentlichung in einem Backend komplizierter wird, wenn sich die Anwendung weiterentwickelt. In meiner app verwende ich eine Back-End-Klasse, mit allen Arten von Hilfsklassen:

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: 

} 

Für andere Fälle oft ich Erweiterungen auf Swift-Klassen verwenden. Wie für ein zufälliges Element aus einem Array.

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

das scheint ziemlich cool. Hast du eine Soe-Beispiel-App? Ich bin ein Neuling und es würde mir sehr helfen. – bruno

0

Sie eine separate swift-Klasse erstellen können, könnte es nennen WebServicesManager.swift, und alle Methoden schreiben darin zu Webanfragen verwandt.

Sie können Klassenmethoden oder Singleton-Muster verwenden, um auf die Methoden zuzugreifen.