从 Swift Playground 中的不同页面访问变量

Posted

技术标签:

【中文标题】从 Swift Playground 中的不同页面访问变量【英文标题】:Accessing variables from different pages in Swift Playground 【发布时间】:2020-05-10 20:23:44 【问题描述】:

我的游乐场中有 2 个不同的页面,其中包含一组公共变量,我想在我的其他页面中使用这些变量(我没有在那里声明任何变量)。这可能吗?

【问题讨论】:

【参考方案1】:

您需要使用@EnvironmentObject 变量。

转到 WindowScene 文件。在那里您可以创建对象并将其传递给根视图。像这样:

func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) 
    ...
    let device = Device()
    let contentView = ContentView().environmentObject(device)
    ...

environmentObject(device) 将设备价值兑现。在 ContentView 中,您可以通过像这样使用 EnvironmentObject 包装器定义变量来访问它

struct ContentView: View
    @EnvironmentObject var device: Device
    var body: some View
         ...
    

请注意,您没有提供任何名称或 ID 来存储该值。变量类型就是那个 ID。当您更改一个视图中的值时,所有其他视图都将收到通知并自行更新。那是@EnvironmentObject 的包装器。

这是您可以在视图之间共享数据的方式。是的,您还可以在其他视图init() 中创建一些视图并将它们作为结构存储在另一个视图的存储属性中,然后访问结构属性。有时它有助于解决一些性能问题,但总的来说这不是 SwiftUI 的工作方式。

Playground 也可以运行 SwiftUI 代码:

import SwiftUI
import PlaygroundSupport
class Counter: ObservableObject
    @Published var currentValue = 0

struct ContentView: View 
    @EnvironmentObject var counter: Counter
    var body: some View 
        VStack
            Text("count is \(counter.currentValue)")
            Text("tap me")
                .onTapGesture 
                    self.counter.currentValue += 1
            
        
    

var counter = Counter()
PlaygroundPage.current.setLiveView(ContentView().environmentObject(counter))

【讨论】:

这是否也适用于 Swift Playground 或仅适用于 Xcode?​​span> 如果我的解决方案有助于解决您的问题,请按左侧的绿色复选框接受它。

以上是关于从 Swift Playground 中的不同页面访问变量的主要内容,如果未能解决你的问题,请参考以下文章

Swift Playground 4:导入 Swift 包

Swift 4 Playground - 从 JSON 获取对象/结果

我正在从 swift playground 保存一个文本文件。但无法在我的 Mac 中找到该文件

Swift 中的 Playground 不会使用 Firebase

如何使用 Swift 3 Playground 读取 Resources 目录中的文本文件?

在 Playground 中的 swift 3 中添加延迟似乎不准确