In [561]: arr[:]=[np.arange(3) for i in range(5)]
In [562]: arr
Out[562]:
array([array([0, 1, 2]), array([0, 1, 2]), array([0, 1, 2]),
array([0, 1, 2]), array([0, 1, 2])], dtype=object)
协议的定义如下:
View
所以public protocol View : _View {
/// The type of view representing the body of this view.
///
/// When you create a custom view, Swift infers this type from your
/// implementation of the required `body` property.
associatedtype Body : View
/// Declares the content and behavior of this view.
var body: Self.Body { get }
}
现在是PATed协议,它不能直接用作返回类型,尽管swift 5.1的不透明返回类型可以处理此问题,但是为什么要声明View
,而不是直接associatedtype Body : View
?
答案 0 :(得分:1)
因为仅仅是var body: Self.Body { get }
-实现View
协议的您的实体将不知道body
的类型。
struct MyView: View {
var body: MyAnotherView {
//implementation...
}
}
此代码将无法编译,您必须编写以下代码:
struct MyView: View {
var body: View {
//implementation...
}
}
我认为,在幕后,SwiftUI必须知道View
的确切类型,而不仅仅是协议
答案 1 :(得分:-1)
在SwiftUI之前,Swift不允许我们将关联类型的协议用作返回类型,但是我们可以使用“常规”协议。 编译器让您通过显示以下错误来进行限制:
“由于协议具有自我或相关类型要求,因此只能用作通用约束。”
这是什么意思?
编译器无法从此定义中推断关联的类型,并且返回类型将不完整。
每当调用那个函数时,它总是返回不同的具体类型,而不是相同的具体类型。
为避免每次调用时使用不同的具体类型作为返回类型,我们使用 some 关键字作为不透明的返回类型。
不透明返回类型: