在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是如何做到的呢?
答案 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)
}
}
}