Swift中的正确风格:Guard Statement

时间:2016-01-29 17:59:45

标签: swift

我正在用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是一个自定义日志记录类,它具有优化的控制台输出。

1 个答案:

答案 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}}中)。