【问题标题】:Can I make a protocol that inherits from 'View' to display a specific 'View'?我可以制作一个从“视图”继承的协议来显示特定的“视图”吗?
【发布时间】:2019-07-12 14:06:52
【问题描述】:

我正在尝试制作一些具有类似属性的 SwiftUI 视图。所以我想为他们制定一个协议并显示这个协议的一个实例。

protocol SpecialView: View { ... }

struct SpecialViewA : View, SpecialView {
    ...
    var body: some View {
        Text("Hello World!")
    }
}

struct ContentView: View {
    var currentlyDisplayedView: some SpecialView

    var body: some View{
        currentlyDisplayedView
    }

}

//in preview:
ContentView(SpecialViewA())

我希望 ContentView 接受我的 SpecialViewA 作为 SpecialView。但是,在我得到的预览中 “无法将 'SpecialViewA' 类型的值转换为预期的参数类型 'some SpecialView'”。 并且在尝试显示时我得到: “[...] 要求 'some SpecialView' 符合 'View'”

我做错了什么?有没有更简单的方法?

【问题讨论】:

    标签: swift swift-protocols swiftui


    【解决方案1】:

    你很接近...,但这将编译:

    protocol SpecialView: View {
    }
    
    struct SpecialViewA : View, SpecialView {
        var body: some View {
            Text("Hello World!")
        }
    }
    
    struct ContentView<V>: View where V: SpecialView {
        var currentlyDisplayedView: V
    
        var body: some View{
            currentlyDisplayedView
        }
    
    }
    
    #if DEBUG
    struct ContentView_Previews : PreviewProvider {
        static var previews: some View {
            ContentView(currentlyDisplayedView: SpecialViewA())
        }
    }
    #endif
    

    【讨论】:

      猜你喜欢
      • 2019-10-29
      • 1970-01-01
      • 1970-01-01
      • 2019-02-16
      • 2017-07-12
      • 2013-05-05
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      相关资源
      最近更新 更多