我刚刚开始学习SwiftUI,并尝试调用一个返回View的方法给View类型的变量,但是出现了这个令人惊讶的错误:
Cannot assign value of type 'some View'
(result of 'Self.frame(width:height:alignment:)')
to type 'some View'
(result of 'Self.fill(_:style:)')
我想尝试为视图构图,只是为了了解会发生什么,以了解SwiftUI如何得出事物的尺寸。
let p = Path({ (path:inout Path) -> () in
path.addRect(CGRect(
x:0,
y:0,
width:geometry.size.width,
height:geometry.size.height
))
})
var result = p.fill(Color.red)
result = result.frame(width: 100, height: 100)
我认为这里发生的事情是,首先我要创建一个struct Path
,并调用其fill方法将其转换为View。当我将var result
设置为该返回值时,应该推断出它具有类型View
,XCode表示确实如此。
由于View协议具有frame(width:height:alignment:) -> some View
方法,因此我称其为新视图。现在,由于result
被推断为一个视图,而我要为其分配一个也是视图的frame
的结果,那不合法吗?
(在another StackOverflow question上,有人评论“某些视图-表示一种符合View的具体类型,它一次不能是MenuView,而另一次不能是CreateChannelView。” 。如果是这样,我也想知道如何查看方法返回的具体类型。)
答案 0 :(得分:1)
代替
var result = p.fill(Color.red) result = result.frame(width: 100, height: 100)
将直接组合的视图用作
return p.fill(Color.red).frame(width: 100, height: 100)
some View
的意思是一些不透明的具体视图类型,但是要使用赋值类型,必须必须相同,但是修饰符.fill
和{{1 }}产生不同的具体类型,这就是您的分配产生错误的原因。