我正在用Swift弄湿我,我想知道卫兵的正确风格是什么。我正确使用guard
声明吗?感觉有点笨重,但我更喜欢if let
声明。或者这可以简化吗?
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
var tableView: UITableView?
...
required init() {
super.init(nibName:nil, bundle:nil)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
// MARK: - User Interface
func setupUI() {
...
// tableView
tableView = UITableView()
guard let tableView = tableView else {
Log.msg("tableView could not be initialized")
return
}
tableView.delegate = self
tableView.dataSource = self
tableView.separatorInset = UIEdgeInsetsZero
tableView.layoutMargins = UIEdgeInsetsZero
tableView.accessibilityIdentifier = "tableView"
tableView.translatesAutoresizingMaskIntoConstraints = false
self.view.addSubview(tableView)
...
}
}
Log
是一个自定义日志记录类,它具有优化的控制台输出。
答案 0 :(得分:1)
虽然我认为这个问题应该转移到codereview网站,但我会提到:
从语法的角度来看,您正在使用guard
语句。如果不满足条件,这是一种检查某些东西并提前返回的方法。您的整体实现需要进行一些重构,因此您根本不需要guard
。
创建视图控制器时,请改为:
class ViewController: UIViewController {
private var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView = {
let tableView = UITableView()
tableView.property = ...
return tableView
}()
view.addSubview(tableView)
// setup constraints on tableView...
}
}
通过为tableView
属性使用隐式展开的可选项,您无需在guard
使用tableView
并在nil
viewDidLoad()
进行测试,但需要使用{{1}}您还可以获得延迟初始化的好处(在{{1}}中)。