SwiftUI中的闭包、计算属性和函数参数
闭包参数
SwiftUI中闭包作为函数参数的使用方式。
- Name
闭包语法
- Type
- closure
- Description
- 尾随闭包语法
- 多个闭包参数
- 逃逸闭包(@escaping)
- 自动闭包(@autoclosure)
- Name
常见用途
- Type
- usage
- Description
- 回调函数
- 动画完成处理
- 数据转换
- 条件判断
闭包参数示例
// 基本闭包参数
func perform(completion: () -> Void) {
// 执行某些操作
completion()
}
// 尾随闭包
Button("点击") {
print("按钮被点击")
}
// 带参数的闭包
func process(handler: (Int) -> String) {
let result = handler(42)
print(result)
}
计算属性
SwiftUI中计算属性的定义和使用。
- Name
计算属性类型
- Type
- computed
- Description
- 只读计算属性
- 可读写计算属性
- 属性观察器(willSet/didSet)
- Name
使用场景
- Type
- scenarios
- Description
- 数据转换
- 状态派生
- 条件判断
- 格式化输出
计算属性示例
struct ContentView {
var firstName = "张"
var lastName = "三"
// 只读计算属性
var fullName: String {
"\(firstName)\(lastName)"
}
// 可读写计算属性
var score: Int {
get { _score }
set { _score = min(newValue, 100) }
}
private var _score = 0
}
函数参数传递
SwiftUI中不同类型参数的传递方式。
- Name
参数类型
- Type
- parameters
- Description
- 值类型参数
- 引用类型参数
- inout参数
- 默认参数值
- Name
参数标签
- Type
- labels
- Description
- 显式参数标签
- 省略参数标签(_)
- 默认参数标签
参数传递示例
// 值类型参数
func updateScore(score: Int) {
// score是副本
}
// inout参数
func increment(value: inout Int) {
value += 1
}
// 默认参数
func greet(name: String = "访客") {
print("你好, \(name)")
}
// 参数标签
func move(from source: Int, to destination: Int) {
// 使用source和destination
}
最佳实践
参数传递和属性使用的推荐做法。
- Name
闭包使用
- Type
- closure-tips
- Description
- 适当使用尾随闭包
- 注意内存循环引用
- 合理使用@escaping
- 避免复杂嵌套
- Name
性能考虑
- Type
- performance
- Description
- 避免过度使用计算属性
- 合理使用缓存
- 注意值类型复制开销
- 适时使用lazy属性
最佳实践示例
class ViewModel {
// 避免循环引用
func fetchData(completion: @escaping () -> Void) {
weak var weakSelf = self
// ...
}
// 缓存计算结果
private var _cachedValue: Int?
var computedValue: Int {
if let cached = _cachedValue {
return cached
}
// 计算并缓存
_cachedValue = /* 复杂计算 */
return _cachedValue!
}
}