2014-11-20 67 views
28

我寫了一個簡單的函數,它在被調用時顯示一個警報。我想在幾個viewControllers中使用這個函數。現在,我有相同的代碼複製粘貼到每個viewController的底部,但我不禁想到有一個更好的方法。如何在Swift中定義全局函數?

如何定義一個可以從任何viewController調用的函數?

僅供參考,我將在下面粘貼我的功能,但這是一個普遍問題。我希望能夠找到一種能夠在所有視圖控制器中以相同方式處理鍵盤管理的雄辯方法。

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

打電話給他們你找到任何方法來保持在單獨的類中的所有鍵盤代碼。 – 2016-08-04 13:09:39

+0

我能夠將UIViewController的子類放在一起,工作正常。但這有點冒險。我認爲一個協議是最好的辦法,但是當我最近嘗試重做時,我遇到了添加NSNotificationCenter和Swift的兼容性問題。關於Cocoa在Objective-C中的一些事情使得不可能添加觀察者。 – Erik 2016-08-05 02:20:42

回答

54

除非你聲明的功能privatefileprivate,這限制了能見度在那裏定義的文件或範圍,你可以在任何地方的模塊中使用它,如果聲明爲internal(默認值),也如果聲明爲外部模塊publicopen

但是既然你說你只需要它在視圖控制器,爲什麼不實現它作爲視圖控制器的擴展?

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

這是一個好主意!我剛剛嘗試過,它的功能就像一個魅力! – Erik 2014-11-20 22:33:29

+0

Daaaaaayum!這很棒。這完全避免了所有額外的代碼和工作,如果你想要使用委託func或使用NSObserver的路徑。謝謝你爲我節省了無限的時間。這是我第一次使用擴展。真棒 – FireDragon 2015-10-13 20:28:43

+1

全局函數是一種代碼味道。每當你要......不要。除非它是一個操作員過載或什麼的。 – Alexander 2015-12-15 16:55:33

2

默認情況下,您將在項目中獲得「ViewController.swift」文件。你可以在其中加入一些默認的全局函數Ex。 「檢查Internet連接」

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) 

    } 

而且通過

let testConn = ViewController.connectedToNetwork() 
+0

如果您可以添加正確的縮進幷包含在ViewController中定義的函數,那將會很好。這可能會讓其他人感到困惑,認爲這是一個全球性的功能,正如它在問題標題上所說的那樣。 – rgkobashi 2018-02-21 05:46:51