SwiftUI 里的 swift 闭包总结
创建 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 闭包总结的更多相关文章
- Swift闭包概念与常见使用场景总结
·Swift 闭包 闭包(Closures)是自包含的功能代码块,可以在代码中使用或者用来作为参数传值. Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks)以及其他一些 ...
- Swift --闭包表达式与闭包(汇编分析)
在Swift中,可以通过func定义一个函数,也可以通过闭包表达式定义一个函数! 一.闭包表达式 概念 闭包表达式与定义函数的语法相对比,有区别如下: 去除了func 去除函数名 返回值类型添加了关键 ...
- Swift 闭包的简单学习
OC中已经学习了闭包 在swift里面 该怎么处理 不多说 上代码 //(num:Int) ->Bool是闭包的参数类型 func hasCloserMatch(arr :[Int], valu ...
- [译]理解 SwiftUI 里的属性装饰器@State, @Binding, @ObservedObject, @EnvironmentObject
原文地址:https://mecid.github.io/2019/06/12/understanding-property-wrappers-in-swiftui/ @States 通过使用 @St ...
- swift 闭包循环引用
当使用闭包时,类本身持有self,然后又在闭包中访问了self或者self的属性,就会导致恶心额循环引用.swift提供的解决方法是在闭包中定义捕获列表,捕获列表是闭包想怎么引用捕获来的变量.例如下面 ...
- swift 闭包
闭包可以捕获和存储其所在上下文中任意常量和变量的引用. 这就是所谓的闭合并包裹着 这些常量和变量,俗称闭包. Swift标准库中提供了sort排序函数,sort函数的第二个参数是个闭包.和OC中的bl ...
- [ios][swift]使用swift闭包进行viewcontroller反向传值
闭包参考:http://c.biancheng.net/cpp/html/2285.html 闭包详解 传值参考:http://www.tuicool.com/articles/vy2uUz Sw ...
- swift 闭包+嵌套函数+extension+单例+嵌套函数+??
//: Playground - noun: a place where people can play import UIKit //*******************嵌套函数********* ...
- swift 闭包简写实际参数名$0、$1等理解
Swift 自动对行内闭包提供简写实际参数名,你也可以通过 $0 , $1 , $2 等名字来引用闭包的实际参数值. 如果你在闭包表达式中使用这些简写实际参数名,那么你可以在闭包的实际参数列表中忽略对 ...
随机推荐
- Sql server时间转时间long
DATEDIFF( S, '1970-01-01 00:00:00', a.endor_date ) - 8 * 60*60 ) actionTime, SELECT DATEADD(S,116070 ...
- BZOJ 5129: [Lydsy1712月赛]树上传送 点分树+Dijkstra
Description http://www.lydsy.com/JudgeOnline/upload/201712/prob12.pdf Input Output 暑假集训的时候点分树做的比较少,所 ...
- HDU-6705 Path
Description You have a directed weighted graph with n vertexes and m edges. The value of a path is t ...
- R list和data frame 排序
pathway_name = rownames(g1) tm <- list('P-value' = c(), 'Pathway_name' = c()) :dim(g1)[]){ result ...
- Socket网络通信编程(二)
1.Netty初步 2.HelloWorld 3.Netty核心技术之(TCP拆包和粘包问题) 4.Netty核心技术之(编解码技术) 5.Netty的UDP实现 6.Netty的WebSocket实 ...
- bootstrap插件bootstrap-select使用demo
插件bootstrap-select官网 : https://developer.snapappointments.com/bootstrap-select/ bootstrap-select插件: ...
- 【l转】VS2015下解决:无法解析的外部符号 __imp___vsnprintf 及__iob_func
https://blog.csdn.net/hebbely/article/details/53780562
- React-Native 之 GD (八)GET 网络请求封装
1.到这里,相信各位对 React-Native 有所熟悉了吧,从现在开始我们要慢慢往实际的方向走,这边就先从网络请求这部分开始,在正式开发中,网络请求一般都单独作为一部分,我们在需要使用的地方只需要 ...
- DAY 5 上午
或者跑一个dp dp[i]表示总花费不超过i的情况下的最短路 dij套dp o(nk)个点 对于每一个点u,建立k+1个点表示到点u花费费用为i 比如u-->v长度为c u,0-->v,c ...
- 深入探讨 Python 的 import 机制:实现远程导入模块
深入探讨 Python 的 import 机制:实现远程导入模块 所谓的模块导入( import ),是指在一个模块中使用另一个模块的代码的操作,它有利于代码的复用. 在 Python 中使用 ...