美文网首页
swift 语法糖

swift 语法糖

作者: 04f67677dbf8 | 来源:发表于2016-09-05 19:21 被阅读0次

    if let 与 guard 语法糖

    话说if let 和 guard 只是语法糖,没有也可以,但有了可以使得代码更简洁方便。要理解 if let 和 guard,不妨设想假如没有这两者,代码会怎么写。

    if let

    func doSomething(str: String?)

    {

    let v: String! = str

    if v != nil

    {

    // use v to do something

    }

    }

    Swift 中因为有optional, 经常需要判断是否为空。假如没有if let,大致写成上面的样子,有了if let, 可以改写成

    func doSomething(str: String?)

    {

    if let v = str

    {

    // use v to do something

    }

    }

    上面两段代码的控制流是一样的。对照着,可以看出if let的写法更加简洁方便。

    guard

    假如if中出现的代码很长,我们写代码时可以将错误情况先返回。比如:

    func doSomething(str: String?)

    {

    let v: String! = str

    if v == nil

    {

    return

    }

    // use v to do something

    }

    这样做可以避免过多的嵌套。上面代码实在太常见了,swift也提供一个guard这个语法糖,用guard可以改写成:

    func doSomething(str: String?){

    guard let v = str else { return }

    // use v to do something

    }

    上面两段代码的控制流是一样的。也可以看出guard的写法更加简洁方便。

    至于if let 和 guard 语法中出现的where,只是附加一些条件。相当于逻辑运算 && 和 ||。SQL中的条件语法也是用where这个关键字。

    假如还不理解,动手将一段代码,不用if let 和 guard 进行改写。试多几次,就会发觉很自然了。

    语法糖Selector例子

    创建控制器,添加Button

    override func viewDidLoad() {

    super.viewDidLoad()

    let btn = UIButton(frame: CGRectMake(100,100,100,100))

    btn.backgroundColor = UIColor.redColor()

    view.addSubview(btn)

    }

    func printFire() {

    print("fire")

    }

    想实现控制器里的Button点击事件,但是,如果一个控制器里的Button特别的多,那添加Button点击事件的Selector 会觉得特别的臃肿。所以语法糖就是要拓展Selector

    private extension Selector {

    static let printFire = #selector(ViewController.printFire)

    }

    我们现在给viewDidLoad方法中的Button 添加点击事件

    btn.addTarget(self, action: .printFire, forControlEvents: .TouchUpInside)

    如果Button过多的话,用语法糖方便管理Button的点击事件,又不会把点击事件变得过于臃肿

    下面是控制器的完整代码

    import UIKit

    class ViewController: UIViewController {

    override func viewDidLoad() {

    super.viewDidLoad()

    let btn = UIButton(frame: CGRectMake(100,100,100,100))

    btn.backgroundColor = UIColor.redColor()

    btn.addTarget(self, action: .printFire, forControlEvents: .TouchUpInside)

    view.addSubview(btn)

    }

    func printFire() {

    print("fire")

    }

    override func didReceiveMemoryWarning() {

    super.didReceiveMemoryWarning()

    // Dispose of any resources that can be recreated.

    }

    }

    private extension Selector {

    static let printFire = #selector(ViewController.printFire)

    }

    相关文章

      网友评论

          本文标题:swift 语法糖

          本文链接:https://www.haomeiwen.com/subject/tfrjjttx.html