2014-11-20 19 views
28

Ich schrieb eine einfache Funktion, die eine Warnung anzeigt, wenn es aufgerufen wird. Ich möchte diese Funktion in mehreren ViewControllern verwenden. Im Moment habe ich den gleichen Code in die Unterseite jedes ViewControllers kopiert, aber ich kann nicht anders, als zu denken, dass es einen besseren Weg gibt.Wie sind globale Funktionen in Swift definiert?

Wie kann man eine Funktion definieren, die von jedem viewController aufgerufen werden kann?

Nur als Referenz werde ich meine Funktion unten einfügen, aber das ist eine allgemeine Frage. Ich möchte in der Lage sein, einen eloquenten Weg zu finden, die Tastaturverwaltung auf allen View-Controllern identisch zu handhaben.

func displayAlert(title:String, error:String, buttonText: String) { 

    // Create the alert 
    var alert = UIAlertController(title: title, message: error, preferredStyle: UIAlertControllerStyle.Alert) 

    // Add an action 
    alert.addAction(UIAlertAction(title: buttonText, style: .Default, handler: { action in 

     // Dismiss when the button is pressed 
     self.dismissViewControllerAnimated(true, completion: nil) 

    })) 

    // Add it to viewController 
    self.presentViewController(alert, animated: true, completion: nil) 
} 
+0

Sie jede mögliche Weise finden Sie alle Tastatur-Code in separaten Klasse zu halten. –

+0

Ich konnte eine Unterklasse von UIViewController zusammenstellen, die in Ordnung ist. Aber es ist ein bisschen hacky. Ich denke, ein Protokoll wäre der beste Weg, es zu tun, aber als ich versuchte, es so vor kurzem zu wiederholen, stieß ich auf Kompatibilitätsprobleme mit dem Hinzufügen von NSNotificationCenter und Swift. Etwas über Kakao in Objective-C machte es unmöglich, Beobachter hinzuzufügen. – Erik

Antwort

54

Sofern Sie die Funktion als private oder fileprivate, erklären die die Sichtbarkeit auf die Datei oder den Umfang beschränken, in denen sie definiert ist, können Sie es überall im Modul verwenden, wenn als internal (Standardeinstellung) erklärt, und auch von externen Modulen, wenn sie als public oder open deklariert sind.

Da Sie jedoch sagen, dass Sie es nur in View-Controllern benötigen, warum implementieren Sie es nicht als Erweiterung für den View-Controller?

extension UIViewController { 
    func displayAlert(title:String, error:String, buttonText: String) { 
     ... 
    } 
} 
+3

Das ist eine großartige Idee! Ich habe es gerade ausprobiert und es hat wie ein Zauber funktioniert! – Erik

+0

Daaaaaayum! Das ist toll. Dies vermeidet vollständig den zusätzlichen Code und funktioniert, wenn Sie den Weg der Verwendung einer Delegate-Funktion oder vielleicht der Verwendung von NSObserver gehen würden. Danke, dass du mir unendlich viel Zeit gespart hast. Dies ist das erste Mal, dass ich eine Erweiterung verwendet habe. Awesome – FireDragon

+1

Globale Funktionen sind ein Code-Geruch. Wann auch immer Sie ... nicht tun. Es sei denn, es ist eine Überlastung des Bedieners oder so. – Alexander

2

Standardmäßig erhalten Sie die Datei "ViewController.swift" in Ihrem Projekt. Sie können einige globale Standardfunktionen darin einfügen Ex.

import SystemConfiguration 

class func connectedToNetwork() -> Bool { 

var zeroAddress = sockaddr_in() 
zeroAddress.sin_len = UInt8(sizeofValue(zeroAddress)) 
zeroAddress.sin_family = sa_family_t(AF_INET) 

guard let defaultRouteReachability = withUnsafePointer(&zeroAddress, { 
       SCNetworkReachabilityCreateWithAddress(nil, UnsafePointer($0)) 
}) else { 
     return false 
} 

var flags : SCNetworkReachabilityFlags = [] 
if SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags) == false { 
      return false     
    } 


    let isReachable = flags.contains(.Reachable)   
    let needsConnection = flags.contains(.ConnectionRequired)   
      return (isReachable && !needsConnection) 

    } 

"Internet Connection Check" Und sie rufen durch

let testConn = ViewController.connectedToNetwork() 
+0

Es wird nett sein, wenn Sie die richtige Einrückung hinzufügen und hinzufügen können, dass die Funktion in ViewController definiert ist. Dies könnte andere Menschen verwirren und denken, dass dies eine globale Funktion ist, wie es auf dem Titel der Frage steht. – rgkobashi

Verwandte Themen