ViewModel 上的 ObservableObject 或 INotifyPropertyChanged

swift

1个回答

写回答

小彤睡不醒

2025-06-21 15:10

+ 关注

Swift
Swift

使用 ObservableObject 或 INotifyPropertyChanged 可以实现在应用程序中对数据的更改进行实时监测,并在数据发生变化时自动更新相关的界面。这两个接口都是为了实现 MVVM(Model-View-ViewModel)架构而设计的,可以使代码更加模块化和可维护。本文将分析这两个接口的用法,并提供一个简单的案例来演示它们的实际应用。

ObservableObject 接口是 SwiftUI 框架中的一个协议,用于在视图中观察和响应数据的变化。通过实现该接口,我们可以将数据模型和视图解耦,并且在数据发生变化时自动更新视图。下面是一个简单的例子:

Swift

import SwiftUI

class MyData: ObservableObject {

@Published var count: Int = 0

}

struct ContentView: View {

@ObservedObject var data = MyData()

var body: some View {

VStack {

Text("Count: \(data.count)")

Button("Increase") {

self.data.count += 1

}

}

}

}

在上述代码中,我们定义了一个名为 MyData 的类,该类实现了 ObservableObject 接口。其中,通过 @Published 属性包装器修饰 count 属性,使其成为一个可观察的属性。在视图中,我们通过 @ObservedObject 属性包装器将 MyData 实例与视图绑定,这样当 count 属性发生变化时,视图会自动更新。

当点击按钮时,count 属性会递增,并且视图中的文本会实时更新,展示最新的数值。

INotifyPropertyChanged 接口是在 .NET 框架中用于实现数据绑定的一种方式。通过在数据模型中触发 PropertyChanged 事件,我们可以通知界面相关的控件进行更新。下面是一个简单的例子:

csharp

using System.ComponentModel;

class MyData : INotifyPropertyChanged

{

private int count;

public int Count

{

get { return count; }

set

{

if (count != value)

{

count = value;

OnPropertyChanged(nameof(Count));

}

}

}

public event PropertyChangedEventHandler PropertyChanged;

protected virtual void OnPropertyChanged(string propertyName)

{

PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));

}

}

class Program

{

static void MAIn(string[] args)

{

MyData data = new MyData();

data.PropertyChanged += (sender, e) =>

{

if (e.PropertyName == "Count")

{

Console.WriteLine($"Count: {data.Count}");

}

};

data.Count = 1;

data.Count = 2;

}

}

在上述代码中,我们定义了一个名为 MyData 的类,该类实现了 INotifyPropertyChanged 接口。在 Count 属性的 setter 方法中,我们首先判断新值是否与旧值相等,如果不相等,则更新属性值,并触发 PropertyChanged 事件。

MAIn 方法中,我们创建了一个 MyData 实例,并订阅了 PropertyChanged 事件。当 Count 属性发生变化时,会输出最新的数值。

这两个接口都是非常有用的,可以帮助我们实现数据的实时监测和界面的自动更新。无论是在 SwiftUI 还是在 .NET 框架中,都可以通过这两个接口来实现数据绑定和响应式编程的功能。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号