通用结构'StateObject'要求'GraphicsOverlay'符合'ObservableObject'

126
2
跳到解决方案
3周前
DuanePfeiffer
通过
新贡献者III

当我添加以下行到我的视图,我从编译器得到错误。项目现在不会编译。我从“搜索地理代码”示例中得到了这行代码。

@StateObject私人varinspectedOverlay= GraphicsOverlay ()

通用结构'StateObject'要求'GraphicsOverlay'符合'ObservableObject'

0荣誉
1解决方案

接受的解决方案
停
通过 Esri贡献者
Esri贡献者

建议将这些引用类型对象放在符合的类视图模型对象中ObservableObject协议如下。看看苹果的例子在这里

类模型:ObservableObject {let graphicsOverlay = graphicsOverlay() //…以下其他属性}

背后的原因是图形叠加并不是“具有发布者的对象类型,该发布者在对象更改之前发出。(从苹果医生".换句话说,它不会用已发布的状态驱动UI更新,因此作为一个ObservableObject在语义上是错误的。

然而,到今天为止,在SwiftUI中还没有一个属性包装器来表示“我想在视图重新计算之间保持一个对象不变,但该对象实际上不需要是可观察的。”StateObject可以工作,但不是完美的。此外,苹果可能会远离ObservableObject在未来的版本中(球场)。

尽管如此,你还是可以遵循GraphicsOverlaytype到ObservableObject协议,例如

//在你的代码中…扩展GraphicsOverlay: ObservableObject {}

然后你可以将对象作为@StateObject没有问题。

最后,示例查看器没有得到此错误,而您的代码却得到此错误的原因是使用地理代码搜索样例中,它导入了工具包,该工具包在200.0.0-beta中添加了一些如上所示的ObservableObject一致性。我们正在考虑在200.1.0中删除此一致性。

在原帖子中查看解决方案

0荣誉
2回答
停
通过 Esri贡献者
Esri贡献者

建议将这些引用类型对象放在符合的类视图模型对象中ObservableObject协议如下。看看苹果的例子在这里

类模型:ObservableObject {let graphicsOverlay = graphicsOverlay() //…以下其他属性}

背后的原因是图形叠加并不是“具有发布者的对象类型,该发布者在对象更改之前发出。(从苹果医生".换句话说,它不会用已发布的状态驱动UI更新,因此作为一个ObservableObject在语义上是错误的。

然而,到今天为止,在SwiftUI中还没有一个属性包装器来表示“我想在视图重新计算之间保持一个对象不变,但该对象实际上不需要是可观察的。”StateObject可以工作,但不是完美的。此外,苹果可能会远离ObservableObject在未来的版本中(球场)。

尽管如此,你还是可以遵循GraphicsOverlaytype到ObservableObject协议,例如

//在你的代码中…扩展GraphicsOverlay: ObservableObject {}

然后你可以将对象作为@StateObject没有问题。

最后,示例查看器没有得到此错误,而您的代码却得到此错误的原因是使用地理代码搜索样例中,它导入了工具包,该工具包在200.0.0-beta中添加了一些如上所示的ObservableObject一致性。我们正在考虑在200.1.0中删除此一致性。

0荣誉
DuanePfeiffer
通过
新贡献者III

这很有道理。我最终把它放到全局视图模型对象中,这样我就可以在我的应用程序的任何地方添加图形。然而,这个示例让我有点困惑。

谢谢你的澄清。