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!
    }
}

这篇文章对你有用吗?