将使用Swift';s Guard或如果让关键字处理不必使用此checkNil函数?
我知道用Swift等语言编程可以用多种方式表达意图。我正在跟随一个教程,看到了下面的代码,这不是我经常看到的,因为作者创建了一个函数来检查nil。通过简单地使用guard或if-let语句或者确实以某种方式改进了代码,可以避免checkNil函数吗?这是一个很棒的教程,我只是想提高我对解释其他开发人员代码的知识,以找到更简洁的方法将使用Swift';s Guard或如果让关键字处理不必使用此checkNil函数?,swift,optional,guard,Swift,Optional,Guard,我知道用Swift等语言编程可以用多种方式表达意图。我正在跟随一个教程,看到了下面的代码,这不是我经常看到的,因为作者创建了一个函数来检查nil。通过简单地使用guard或if-let语句或者确实以某种方式改进了代码,可以避免checkNil函数吗?这是一个很棒的教程,我只是想提高我对解释其他开发人员代码的知识,以找到更简洁的方法 import UIKit class ViewController: UIViewController { private let rideService
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.
}
}
您可以使用(在选项
部分下)检查此代码中的值是否为零:
let fromText = self.checkNil(from.text as AnyObject?)
可以改为
if let fromText = from.text {
// Run bit of code
}
或者,由于您没有立即使用该值,您可以执行以下操作:
let fromText = from.text ?? ""
使用等同于使用检查为零功能。您可以使用(在选项部分下)检查此代码中的值是否为零:
let fromText = self.checkNil(from.text as AnyObject?)
可以改为
if let fromText = from.text {
// Run bit of code
}
或者,由于您没有立即使用该值,您可以执行以下操作:
let fromText = from.text ?? ""
使用相当于使用检查为零的功能。已知的用于获得可重用性的功能,他在FindLoteButtonClicked
中构造了一次并使用了两次它的代码当然你可以使用guard或let语句但是如果在VC的不同部分有很多字符串来检查它们的可空性呢,他构造了它一次,在里面使用了它的代码两次当然你可以使用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
}
有很多方法可以快速摆脱整个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
}
您缺少一个带有to变量的var。您不需要将它们从IUO更改为应用可选链接。由于没有检查未连接的插座,因此您比原来的CheckNil做得更多。感谢反馈,添加了缺少的关键字—CheckNil
方法从根本上显示了一种错误的方法,并且一次完成了非常糟糕的编码。。。任何提议完全删除该方法的想法都是一种更好的方法。我同意。当我看到你把答案描述为胡说八道的时候,我就把你的答案提高了。你缺少了一个带有to变量的var。您不需要将它们从IUO更改为应用可选链接。由于没有检查未连接的插座,因此您比原来的CheckNil做得更多。感谢反馈,添加了缺少的关键字—CheckNil
方法从根本上显示了一种错误的方法,并且一次完成了非常糟糕的编码。。。任何提议完全删除该方法的想法都是一种更好的方法。我同意。当我看到你把你的回答说成是胡说八道时,我就对它投了赞成票。