【问题标题】:Is it possible to instantiate a SwiftUI view from a string?是否可以从字符串实例化 SwiftUI 视图?
【发布时间】:2021-12-11 20:15:56
【问题描述】:

是否可以将字符串转换为 SwiftUI 视图?类似于 JavaScript 的 eval()。在下面的代码中,我正在寻找一个 XXX 函数。

let uiString: String = “VStack { Text(\“hi there\”) }”
let view: some View = XXX(uiString)

【问题讨论】:

  • 不,不是。 SwiftUI 有一个真正的编译阶段,而不是 JavaScript 的 JIT。
  • 是的,这是可能的,但您需要从Stringsome View 的自定义解码器!没有现成的 API,但如果你愿意,你可以做到。这意味着您正在再次构建 Xcode/SwiftUI!因为您正在敏锐地编译 String 以查看 SwiftUI 的代码。

标签: swift swiftui


【解决方案1】:
  1. 不,因为 Swift 被编译成机器码。没有解释器可以随时随地评估任意表达式。
  2. 这听起来很像一个安全漏洞。为什么要这样做?

【讨论】:

    【解决方案2】:

    !!!不建议 !!!不要在家里尝试这个!

    这是一个示例,但您需要考虑任何可能的观点,或者您是否可以像我一样将工作限制在一些特殊的输入上。

    PS:你可以在代码中做一些大的优化,通过使用更多的 for 循环、开关或枚举来使其更好更快,但归根结底,我在这里展示的东西是 SwiftUI 而不是我们的工作!并且不推荐。这只是一个展示如何编写代码的案例。

    struct ContentView: View {
        var body: some View {
            StringDecoderView(string: "Circle().fill(Color.red); Rectangle()")
        }
    }
    
    struct StringDecoderView: View {
        
        let string: String
        
        var body: some View {
            
            let arrayOfComponents: [String] = string.components(separatedBy: ";")
            
            var anyView: [CustomViewType] = [CustomViewType]()
            
            for item in arrayOfComponents {
                
                if item.contains("Circle()") {
    
                    if item.contains(".fill") && item.contains("Color.red") {
                        anyView.append(CustomViewType(anyView: AnyView(Circle().fill(Color.red))))
                    }
                    else {
                        anyView.append(CustomViewType(anyView: AnyView(Circle())))
                    }
                }
                else if item.contains("Rectangle()") {
                    anyView.append(CustomViewType(anyView: AnyView(Rectangle())))
                }
                
            }
            
            return ForEach(anyView) { item in
                
                item.anyView
                
            }
            .padding()
            
        }
    }
    
    struct CustomViewType: Identifiable {
        let id: UUID = UUID()
        var anyView: AnyView
    }
    

    【讨论】:

    • 谢谢,这是我没有考虑过的聪明方法!
    • 不客气,我说过不推荐,我只是回答了你的问题。
    猜你喜欢
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-16
    • 2013-07-13
    • 2022-08-10
    • 1970-01-01
    • 2021-11-12
    • 2012-05-21
    相关资源
    最近更新 更多