SwiftUI:为什么UIHostingController(rootView :)可以传递nil值?

时间:2020-07-04 22:17:17

标签: swiftui

在Xcode游乐场:

func makeView<T:View>(v: T) -> T?{
    nil
}


let v0 = makeView(v: Text(""))
let view = UIHostingController(rootView: v0)

请注意,不允许func UIHostingController(rootView:)签名传递nil值:

open class UIHostingController<Content> : UIViewController where Content : View {

    public init(rootView: Content)
}

那么为什么我可以将nil传递给UIHostingController(rootView :) ???

谢谢;)

更新:

所以我尝试写一些类似UIHostingController的类:

protocol P{
    var name: String {get}
}

class Container<T> where T: P{
    init(a:T){
        print(a.name)
    }
}

struct A: P {
    var name:String
    
    init?(name:String) {
        
        if name.isEmpty{
            return nil
        }
        
        self.name = name
    }
}

但是当我创建Container的实例时,会发生一些错误:

let p = Container(a: A(name: ""))

编译器抱怨我:

参数类型为“ A?”不符合预期的类型“ P”

那么UIHostingController是如何做到的呢?

1 个答案:

答案 0 :(得分:0)

在下面的代码中,确实V0为零。但是,重要的是要注意v0的类型为Text?。

let view = UIHostingController(rootView: v0)

即使下面的行不起作用

let view = UIHostingController(rootView: nil)

这有效。

let view = UIHostingController<Text?>(rootView: nil)

要纠正错误“泛型类'Container'要求'A?'”符合“ P””,容器类可以如下更新

class Container<T>: X where T: P{
    init(a:T?){
        if let a = a {
            print(a.name)
        }
    }
}