【问题标题】:Memory-related crash caused by the "some" keyword in SwiftSwift 中的“some”关键字导致的内存相关崩溃
【发布时间】:2021-05-15 17:41:32
【问题描述】:

当我使用 some View 类型定义 SwiftUI 视图时,我遇到了 Global buffer overflow 崩溃。当我使用确切的类型时,崩溃就消失了。

这会崩溃:let txt: some View = Text("Hi")

这可行:let txt: Text = Text("Hi")

有什么想法吗?提前致谢。

【问题讨论】:

  • 尝试用some View命名它的用例是什么? `
  • 我有一个应用程序,其中包含一些多次使用的自定义按钮、文本、图像等。我很简单地将这些元素定义在一个单独的文件中,它就在这个文件中发生崩溃的地方。如果我创建一个只有import SwiftUI 和let txt: some View = Text("Hi") 的文件,当我尝试在其他地方使用txt 时它会崩溃。
  • 但为什么将其定义为some View 而不仅仅是Text?
  • 因为我需要定义更复杂的可重用组件,其中用于自定义组件的方法返回 some View 而不是实际的具体类型。例如,let txt: Text = Text("Hi").frame(width: 20, height: 20, alignment: .center) 无法编译,因为 frame 的返回类型为 some View。
  • 是的,我想它可能是这样的。对我来说,这听起来像是在与编译器作斗争。将发布一个可能的解决方案

标签: swift swiftui


【解决方案1】:

不透明类型似乎不适合这样的定义。在这个 SO 线程上有很多有趣的信息:What is the `some` keyword in Swift(UI)?

您可以将变量键入为AnyView 并使用AnyView() 包装/键入擦除内容——然后您可以使用任何您想要的修饰符。

let txt: AnyView = AnyView(Text("Hi").frame(width: 20, height: 20, alignment: .center))

我特别喜欢这个扩展,让它看起来更干净一些:

extension View {
    func eraseToAnyView() -> AnyView {
        return AnyView(self)
    }
}

let txt: AnyView = Text("Hi").frame(width: 20, height: 20, alignment: .center).eraseToAnyView()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-09
    • 2019-10-19
    • 2014-11-22
    • 2016-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多