Ninjiacoder Swift Lover, Fullstack Developer

SwiftUI 的 DSL 语法分析(二)省略 return & 链式调用

省略 return

前言

依然以 SwiftUI 的模板来看一下

struct ContentView : View {
    var body: some View {
        Text("Hello World")
    }
}

发现 body 的返回值是 View,但没有 return ,这也是 Swift 新的语法特性,当函数体只有单独一个表达式时,就会自动添加一个 return 返回这个表达式的值,相当于

struct ContentView: View {
	var body: some View {
		return Text(“Hello world”)
	}
}

Implicit returns from single-expression functions

我们来阅读一下这个新特性的文档: 0255-omit-return 

Introduction

当只含一个表达式时,可以省略 return ,是一个隐式返回。

Motivation

比如这样一段代码,Collection.sum() 的扩展

extension Sequence where Element == Int {
	func sum() -> Element {
		return reduce(0, +)
	}
}

虽然这个实现只有 19 个字符,但是似乎社区的人认为还需要更短,return  这 7 个字符可以干掉。

Proposed solution

于是,就把 return 干掉吧

func sum() -> Element {
	reduce(0, +)
}

省略 return 的做法也帮助 Swift 新手理解这样的闭包代码

let names = persons.map { $0.name }

Detailed design

Function-like entities

  • 函数
     func add(lhs: Int, rhs: Int) -> Int { lhs + rhs }
    
  • 属性
     var location: Location { .init(latitude: lat, longitude: long }
    
  • 下标
     struct Echo<T> {
     	subscript(_ value: T) -> T { value }
     }
    
  • 初始化
     class Derived: Base {
     	required init?() { nil }
     }
    

链式调用

SwiftUI 中的链式调用

struct ContentView : View {
    var body: some View {
        Text("Hello World")
            .bold()
            .font(.title)
    }
}

简单的实现方法

struct myText {
    init(_ str: String) {
        print("init")
    }
    
    func bold() -> myText {
        print("make bold")
        return self
    }
    
    func font(_ font: Font?) -> myText {
        print("change font")
        return self
    }
}

myText("hello").bold().font(.title)

参考文章

  1.  SwiftUI 的 DSL 语法分析 
  2.  What’s new in Swift 5.1 
  3.  0255-omit-return