【问题标题】:some View as an input parameter of a method/initializator一些视图作为方法/初始化器的输入参数
【发布时间】:2020-01-18 15:51:14
【问题描述】:

有人能解释一下some View 应该如何使用吗?

将类型转换为所需类型只是将创建的变量提供给另一个方法/初始化器的适当算法,我说得对吗? 在下面的代码中,只有 force-cast 帮助我创建了一个 TupleView

let shadowRectangle: some View = self.shadowRectangle(
                width: w,
                heightTop: heightTop
            )
            return AnyView(
                ZStack<TupleView<(Rectangle, Path)>>.init(content: { () -> TupleView<(Rectangle, Path)> in
                    return TupleView<(Rectangle, Path)>.init((shadowRectangle as! Rectangle,
                    simplePathView as! Path))
                })

View 的很多方法返回some View 看起来很奇怪。每次我想在当前范围之外使用它时,我都应该强制转换它。比如.offset()方法返回some View

【问题讨论】:

    标签: swift swiftui swift-protocols


    【解决方案1】:

    下面的内容和提供的不一样吗,请原谅,噩梦

    var simplePathView: some View {
        // path to be returned here
    }
    
    func shadowRectangle(width: CGFloat, heightTop: CGFloat) -> some View {
        // rect to be returned here
    }
    
    func foo() -> some View {
        ZStack {
            self.shadowRectangle(width: w, heightTop: heightTop)
            simplePathView
        }
    }
    

    【讨论】:

    • 我只是明确地写了类型。其实没关系。但你是对的。这几乎是一样的。问题不在于显式类型。问题是关于some protocol 类型的使用。
    • some 提供了返回 any 协议实现者的可能性,如上所述,并且类型检查将接受。
    • 我们不能在没有类型转换的情况下为我的自定义方法使用这个变量。还是不行?
    • 如果您在泛型中指定 explicit 类型,那么您必须提供 explicit 类型,但 some 提供了不提供的可能性explicit 类型就像我的快照一样,所以ZStack一些视图的容器,而不是只有矩形和路径的容器跨度>
    【解决方案2】:

    var x: some AnyProtocol 用 swift 告诉你一件事,没有别的:

    x 的值是一个精确类型(并且永远不会改变),并且该特定类型符合 AnyProtocol

    它基本上对你隐藏了确切的返回类型,只让你知道所述类型符合协议,因此你可以在其上调用所述协议的方法。

    回到你的例子,你是对的,如果你希望返回值正好是ZStack&lt;TupleView&lt;(Rectangle, Path)&gt;&gt;,你需要将some View-s 转换为RectanglePath。但通常你不应该需要这样的东西,因为你失去了some 关键字的目的:隐藏视图的确切类型。如果您想要确切的类型,那么您不应该首先使用 some 关键字来隐藏它们。如果您使用精确类型,编译器将再次能够推断出泛型类型,并且不需要强制转换。

    所以,我会在这里做:

    let simplePathView: Path = yourPathCreatingFunc()
    let shadowRectangle: Rectangle = self.shadowRectangle(width: w, heightTop: heightTop)
    return AnyView(ZStack {
        TupleView((simplePathView, shadowRectangle))
    })
    

    我看到很多人不小心使用some View,因为他们认为这对他们有帮助,因为他们不必考虑返回类型或变量类型,他们只是到处写some View。这是一个出错的情况,因为与some的真正含义相冲突(如上所述)。

    所以这个问题更多的是你为什么需要这个,而不是你在语法上是对还是错。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多