@Published 属性包装器及其wrappedValue

swift

1个回答

写回答

李李李lilili

2025-06-30 02:30

+ 关注

Swift
Swift

使用 @Published 属性包装器及其 wrappedValue

Swift 中,@Published 是一种属性包装器,它为我们提供了一种简便的方式来实现属性的发布-订阅模式。当我们在属性前面添加 @Published 时,该属性就会自动获得一个发布者,使得我们可以在属性值发生改变时通知订阅该属性的观察者。这极大地简化了编写具有响应式特性的代码的过程,减少了手动处理属性观察者的细节。

例如,假设我们有一个名为 User 的类,其中包含一个 @Published 属性 name:

Swift

class User {

@Published var name: String = ""

}

我们可以通过创建 User 的实例并订阅其 name 属性的改变来实现对该属性的观察:

Swift

class Observer {

var user = User()

init() {

user.$name.sink { name in

print("Name changed to: \(name)")

}

}

}

let observer = Observer()

observer.user.name = "John"

在上面的例子中,当我们改变 user 实例的 name 属性时,Observer 类中的闭包将被调用,并打印出新的属性值。

使用 @Published 的优势

@Published 属性包装器的主要优势是它提供了一种简化属性观察的方式。在没有 @Published 的情况下,我们需要手动编写代码来通知观察者属性值的改变。这通常需要我们在属性值发生改变时手动调用一个特定的方法或闭包。

但是,使用 @Published,我们只需简单地将其添加到属性前面,并在需要触发观察者的地方进行属性的赋值。这样,当属性值发生改变时,观察者将自动被通知,而无需我们手动处理。

案例代码

让我们通过一个例子来进一步说明 @Published 的用法。假设我们正在开发一个简单的购物车应用程序,其中包含一个用于跟踪购物车中物品数量的属性。

Swift

import Combine

class ShoppingCart {

@Published var itemCount: Int = 0

}

class Observer {

var shoppingCart = ShoppingCart()

init() {

shoppingCart.$itemCount.sink { itemCount in

print("Item count changed to: \(itemCount)")

}

}

}

let observer = Observer()

observer.shoppingCart.itemCount = 10

在上面的代码中,我们定义了一个 ShoppingCart 类,其中包含一个用于存储物品数量的 @Published 属性 itemCount。我们还创建了一个 Observer 类,它订阅了 shoppingCart 实例的 itemCount 属性的改变,并在每次改变时打印出新的物品数量。

当我们在 observer.shoppingCart.itemCount = 10 的地方对 itemCount 属性进行赋值时,Observer 类中的闭包将被调用,并打印出新的物品数量。

通过使用 @Published 属性包装器,我们可以轻松地实现对属性值的观察,并在属性值发生改变时执行相应的操作。这极大地简化了编写具有响应式特性的代码的过程,使我们能够更加专注于业务逻辑的实现。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号