2014-11-20 11 views
28

Napisałem prostą funkcję, która wyświetla alert po jego wywołaniu. Chciałbym użyć tej funkcji w kilku viewControllers. W tej chwili mam ten sam fragment kopiowania kodu - wklejonego na dno każdego kontrolera viewController, ale nie mogę pomóc, ale myślę, że jest lepszy sposób.W jaki sposób zdefiniowane są funkcje globalne w Swift?

Jak zdefiniować funkcję, która może być wywołana z dowolnego kontrolera viewController?

W celach informacyjnych wkleję poniższą funkcję, ale jest to ogólne pytanie. Chciałbym być w stanie znaleźć wymowny sposób obsługi zarządzania klawiaturą w identyczny sposób także we wszystkich kontrolerach widoku.

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

Czy znaleźć jakiś sposób, aby utrzymać cały kod klucza Nadzorczej w oddzielnej klasie. –

+0

Udało mi się utworzyć podklasę UIViewController, która działa poprawnie. Ale jest trochę hacky. Myślę, że protokół byłby najlepszym sposobem, aby to zrobić, ale kiedy próbowałem go tak zmienić ostatnio, natknąłem się na problemy z kompatybilnością z dodaniem NSNotificationCenter i Swift. Coś o tym, że kakao jest w Celu C, uniemożliwiło dodanie obserwatorów. – Erik

Odpowiedz

54

Chyba zadeklarować funkcję jako private lub fileprivate, które ograniczają widoczność do pliku lub zakresu w którym jest zdefiniowana, można go używać w dowolnym miejscu w module jeśli zadeklarowana jako internal (domyślnie), a także z modułów zewnętrznych, jeśli są zadeklarowane jako public lub open.

Jednak skoro mówisz, że potrzebujesz go tylko w kontrolerach widoku, to dlaczego nie wdrożyć go jako rozszerzenia kontrolera widoku?

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

To świetny pomysł! Właśnie próbowałem tego i działało jak czar! – Erik

+0

Daaaaaum! To jest świetne. Całkowicie omija to cały dodatkowy kod i działa, gdy idzie się w dół ścieżką korzystania z funkcji delegata lub z wykorzystaniem NSObserver. Dziękuję za uratowanie mnie nieskończenie wiele czasu. Po raz pierwszy użyłem przedłużenia przy okazji. Awesome – FireDragon

+1

Funkcje globalne to zapach kodu. Ilekroć masz zamiar ... nie rób tego. O ile nie jest to przeciążenie operatora czy coś takiego. – Alexander

2

Domyślnie otrzymujesz plik "ViewController.swift" w swoim projekcie. możesz w nim wstawić domyślną funkcję globalną Przykł. „Sprawdź połączenie z internetem”

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) 

    } 

i nazywają je

let testConn = ViewController.connectedToNetwork() 
+0

Będzie miło, jeśli można dodać właściwe wcięcie i uwzględnić, że funkcja jest zdefiniowana wewnątrz ViewController. Może to wprowadzać w błąd innych ludzi, myśląc, że jest to funkcja globalna, jak to się mówi w tytule pytania. – rgkobashi

Powiązane problemy