使用 Swift 的 Guard 或 if Let Keywords 是否可以不必使用此 checkNil 函数?

Would using Swift's Guard or if Let Keywords take care of not having to use this checkNil function?

我了解使用 Swift 等语言进行编程时,可以通过多种方式表达意图。我正在学习教程并看到下面的代码,这不是我以前看到的代码,因为作者创建了一个函数来检查 nil。是否可以通过简单地使用 guard 或 if let 语句或以某种方式改进代码来避免 checkNil 函数?这是一个很棒的教程,我只是想提高自己在解释其他开发人员代码方面的知识,以找到让自己更简洁的方法。

import UIKit

class ViewController: UIViewController {

    private let rideService = DummyRideService()

    private var rides = [Ride]()

    @IBOutlet var from: UITextField!

    @IBOutlet var to: UITextField!

    @IBOutlet var ridesTableView: UITableView!

    @IBAction func findRouteButtonClicked(){
        let fromText = self.checkNil(from.text as AnyObject?)
        let toText = self.checkNil(to.text as AnyObject?)

    }

    func checkNil(_ string: AnyObject?) -> String {
        return string == nil ? "": string as! String
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

您可以使用 optional binding(在 optionals 部分下)检查此代码中的值是否为 nil:

let fromText = self.checkNil(from.text as AnyObject?)

可以改成

if let fromText = from.text {
    // Run bit of code
}

或者由于您不立即使用该值,您可以这样做:

let fromText = from.text ?? ""

使用 coalescing operator 等同于使用 check-for-nil 函数。

以使用获得可重用性而闻名的函数,他构造一次并在内部使用它的代码两次 findRouteButtonClicked 当然你可以使用 guard 或 let 语句但是如果有很多字符串来检查它们的可空性怎么办VC

的不同部分

有很多方法可以快速摆脱整个 checkNil(_:) 废话。


想法 #1

我只是简单地让 outlets 成为可选的弱属性,然后使用可选的链接,比如:

@IBOutlet private weak var from: UITextField?
@IBOutlet private weak var to: UITextField?

那么你可以使用这个:

@IBAction func findRouteButtonClicked() {

    let fromText = from?.text ?? ""
    let toText = to?.text ?? ""
}

想法 #2

或者如果你想让它更优雅,你可以在 UITextField 上创建一个扩展,比如:

extension UITextField {

    var alwaysText: String {
        return self.text ?? ""
    }
}

因此您可以将 let 行替换为这些更具可读性的行,例如

@IBAction func findRouteButtonClicked() {

    let fromText = from.alwaysText
    let toText = to.alwaysText
}