创建 UI 时的闭包使用

在 SwiftUI 里闭包出现的频率特别高,这里我重新梳理了下闭包的定义。

关于闭包

闭包表达式语法的一般形式如下:

{(parameters) -> return type in
// 代码
}

闭包表达式写在花括号({})里,关键字in用来分隔闭包的参数、返回值与闭包体内的语句

// 传递闭包个 sort 方法
arr.sort(by: { (a: Int, b: Int) -> Bool in
return a > b
}) // 闭包可以利用 Swift 的类型推断能力,可以省略返回类型,以及参数的类型
arr.sort(by: { a, b in
return a > b
}) // 这里移除了关键字return。不是所有的闭包语句都可以移除 return 关键字
// 这里可以是 因为只有一个表达式 (i < j)。如果存在更多表达式,那么显式的 return 就是必需的。
arr.sort(by: { a, b in a > b }) // Swift 提供了快捷参数名,可以在内联闭包 表达式中使用
arr.sort(by: { $0 > $1}) // 如果一个闭包是以一个函数的最后一个参数传递的,那么它就可以在函数的圆括号以外内联。
arr.sort { $0 > $1 }

闭包赋值变量

// 普通方式
var str: String = "str" // 闭包运行赋值
var str2: String = {
return "str2"
}() // 基于闭包原理简化
var str3: String = {
"str3"
}() // 如果不需要传递实参,闭包体前的"="号,和末尾的"()"也可以省略
var str4: String {
"str4"
}

SwiftUI 里的闭包

在声明式的 UI 创建里大量使用闭包,比如

import SwiftUI

struct Text: View {
var body: some View {
Button(action: {
print("Button Click")
}) {
Text("Hello World!")
}
}
}

这里创建 View、Button 都使用了闭包,看了下 Button 的实现,如下

public struct Button<Label> : View where Label : View {

    /// Creates an instance for triggering `action`.
///
/// - Parameters:
/// - action: The action to perform when `self` is triggered.
/// - label: A view that describes the effect of calling `action`.
public init(action: @escaping () -> Void, @ViewBuilder label: () -> Label) /// Declares the content and behavior of this view.
public var body: some View { get } /// The type of view representing the body of this view.
///
/// When you create a custom view, Swift infers this type from your
/// implementation of the required `body` property.
public typealias Body = some View
}

在 init 方法里设置了 2 个参数,都是函数类型,在使用时可以利用 swift 的 尾部闭包语法 :如果一个闭包是以一个函数的最后一个参数传递的,那么它就可以在函数的圆括号以外内联,所以 Button 可以如此写

Button(action: {
print("Button Click")
}) {
Text("Hello World!")
}

也可以这样写

Button(action: { print("Button Click") }, label: { Text("Hello World!") })

SwiftUI 里的 swift 闭包总结的更多相关文章

  1. Swift闭包概念与常见使用场景总结

    ·Swift 闭包 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些 ...

  2. Swift --闭包表达式与闭包(汇编分析)

    在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数! 一.闭包表达式 概念 闭包表达式与定义函数的语法相对比,有区别如下: 去除了func 去除函数名 返回值类型添加了关键 ...

  3. Swift 闭包的简单学习

    OC中已经学习了闭包 在swift里面 该怎么处理 不多说 上代码 //(num:Int) ->Bool是闭包的参数类型 func hasCloserMatch(arr :[Int], valu ...

  4. [译]理解 SwiftUI 里的属性装饰器@State, @Binding, @ObservedObject, @EnvironmentObject

    原文地址:https://mecid.github.io/2019/06/12/understanding-property-wrappers-in-swiftui/ @States 通过使用 @St ...

  5. swift 闭包循环引用

    当使用闭包时,类本身持有self,然后又在闭包中访问了self或者self的属性,就会导致恶心额循环引用.swift提供的解决方法是在闭包中定义捕获列表,捕获列表是闭包想怎么引用捕获来的变量.例如下面 ...

  6. swift 闭包

    闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着 这些常量和变量,俗称闭包. Swift标准库中提供了sort排序函数,sort函数的第二个参数是个闭包.和OC中的bl ...

  7. [ios][swift]使用swift闭包进行viewcontroller反向传值

    闭包参考:http://c.biancheng.net/cpp/html/2285.html   闭包详解 传值参考:http://www.tuicool.com/articles/vy2uUz Sw ...

  8. swift 闭包+嵌套函数+extension+单例+嵌套函数+??

    //: Playground - noun: a place where people can play import UIKit //*******************嵌套函数********* ...

  9. swift 闭包简写实际参数名$0、$1等理解

    Swift 自动对行内闭包提供简写实际参数名,你也可以通过 $0 , $1 , $2 等名字来引用闭包的实际参数值. 如果你在闭包表达式中使用这些简写实际参数名,那么你可以在闭包的实际参数列表中忽略对 ...

随机推荐

  1. Pap.er 模仿 - 第一天

    最后更新: 2017-12-15 一. 项目初始化 解析对应的资源, 下载Pap.er之后,需要解析里面的资源. 采用如下的方法: http://blog.csdn.net/xuzihai0703/a ...

  2. WWDC2017-whats_new_in_safari_view_controller

    最后更新: 2017-08-08 官方地址: https://developer.apple.com/videos/play/wwdc2017/225/ WWDC2017中,对SafariViewCo ...

  3. shouyexinlianjie

    http://7xj7xs.com1.z0.glb.clouddn.com/trail_1.mp4

  4. Linux驱动开发1——基础知识

    1.三类驱动 字符设备驱动:字节流,/dev下有设备节点,file_operations,inode, file 块设备驱动:数据块,/dev下有设备节点,通常有文件系统 网络设备驱动:网络报文的收发 ...

  5. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_13_使用字节流读取中文的问题

    编码格式右下角显示是UTF-8 前三个字节是你,后三个字节是好.一个汉字占用了三个字节 读一个字节让编程char类型 文件里面后面加上abc abc没有问题 所以java提供字符流.字符流一次读取一个 ...

  6. 阶段1 语言基础+高级_1-3-Java语言高级_1-常用API_1_第1节 Scanner类_3-Scanner的使用步骤

    Scanner如何进行键盘输入,引用类型就包含了Scanner,它就是引用类型,所以也有这三个步骤, 导包.创建.使用 先通过api文档找到它.左边输入要查找scanner.双夹scanner右边就会 ...

  7. dict用法

    1 dict.items() https://www.runoob.com/python3/python3-att-dictionary-items.html 2 setdefault的用法 注意se ...

  8. django中间件(获取请求ip)

    def simple_middleware(get_response): # 此处编写的代码仅在Django第一次配置和初始化的时候执行一次. print('1----django启动了') def ...

  9. 券商VIP交易通道

    打新不成就炒新.随着新股发行上市的再次重启,巨大的获利机会引来投资者的争相竞逐,可并非所有投资者都能抢到新股筹码.“每天都在涨停板追这些新股,但从来没有买到过.”证券时报记者在采访中听到不少中小散户如 ...

  10. 练习3-python-创造百万条数据库数据

    有时候需求大批量的数据做测试支撑,如果使用传统的添加数据的方式可能比较耗费时间,利用python可以轻松的完成这项任务,还可以后续维护使用脚本. 方法1:insert into table selec ...