Как глобальные функции определены в Swift?
Я написал простую функцию, которая отображает предупреждение при его вызове. Я хотел бы использовать эту функцию в нескольких viewControllers. Прямо сейчас у меня есть тот же самый бит, который скопирован в нижней части каждого viewController, но я не могу не думать о том, что лучший способ.
Как определить функцию, которая может быть вызвана с любого 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)
}
Ответы
Ответ 1
Если вы не объявите функцию как private
или fileprivate
, которая ограничивает видимость файла или области, где она определена, вы можете использовать ее в любом месте модуля, если объявлено как internal
(по умолчанию), а также из внешних модулей, если объявлено как public
или open
.
Однако, поскольку вы говорите, что вам это нужно только для контроллеров, почему бы не реализовать его как расширение для контроллера представления?
extension UIViewController {
func displayAlert(title:String, error:String, buttonText: String) {
...
}
}
Ответ 2
По умолчанию вы получаете файл "ViewController.swift" в вашем проекте. Вы можете поместить в него глобальную функцию по умолчанию . "Проверьте интернет соединение"
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()