Apple文档的语法在哪里解释? (特别是 swiftUI 文档)
Where is the syntax of Apple documentation explained? (Specifically swiftUI documentation)
苹果软件的语法说明在哪里?例如,当我查找 SwiftUI 的 'List'(Xcode 中的 cmd-shift-0)时,我看到了其他选项:
init<Data, ID, RowContent>(Data, id: KeyPath<Data.Element, ID>, selection: Binding<Set<SelectionValue>>?, rowContent: (Data.Element)
-> RowContent)
太棒了!尖括号是什么意思? "RowContent" 与 "rowContent" 的意义是什么?等。我实际上写了什么来制作清单?这个语法的解释在哪里?
如果这是行业标准(我不这么认为)是什么标准?我不需要一个完全菜鸟的解释,但我需要比我拥有的更多的东西。
1.
如果您查看 List
的 Apple 文档,您的问题中有关于 init
函数的更多信息。
这里的格式如下:
// List declaration
struct List<SelectionValue, Content>
where
SelectionValue : Hashable,
Content : View
// init declaration
init<Data, ID, RowContent>(
_ data: Data,
id: KeyPath<Data.Element, ID>,
selection: Binding<SelectionValue?>?,
@ViewBuilder rowContent: @escaping (Data.Element) -> RowContent
) where
Content == ForEach<Data, ID, HStack<RowContent>>,
Data : RandomAccessCollection,
ID : Hashable,
RowContent : View
有点啰嗦,我同意。
2.
尖括号用于 Generics。这是一个大话题,您需要了解该语言才能继续。
简而言之,泛型是最终具体类型(String
、Int
、HStack
、Foo
等)的占位符将被使用,由该函数的用户定义。
通用占位符类型可以约束以符合特定的协议或继承自某个class。这是通过 where
子句完成的。
3.
所以,一个一个:
列表有 2 个占位符:SelectionValue
和 Content
(可以命名为任何名称,例如 <T, U>
):
struct List<SelectionValue, Content>
并且这些占位符受到限制:
where
SelectionValue : Hashable,
Content : View
它们分别被限制为符合 Hashable
和 View
。
所以,基本上,只要你在其函数定义中看到 Content
,就意味着它可以是 View
的任何实现。 SelectionValue
.
同样
继续:
init<Data, ID, RowContent>
除了 List
声明的占位符之外,init
还泛化为大约三个额外的占位符:Data
、ID
和 RowContent
, 也受约束:
where
Content == ForEach<Data, ID, HStack<RowContent>>,
Data : RandomAccessCollection,
ID : Hashable,
RowContent : View
Content
:必须是 ForEach
(特定类型)。你实际上不应该关心它,因为 Content
不是 init
的任何参数类型
Data
:任何符合RandomAccessCollection
的类型,例如Array
ID
:任何符合Hashable
的类型
RowContent
: 任何符合 View
的类型 - 基本上任何 View
4.
现在,对于参数:
init<Data, ID, RowContent>(
_ data: Data,
id: KeyPath<Data.Element, ID>,
selection: Binding<SelectionValue?>?,
@ViewBuilder rowContent: @escaping (Data.Element) -> RowContent
)
_ data
:是 Data
类型的未标记参数,它(见上文)类似于数组
id
:是一个KeyPath
(也是一个你应该学习的topic of Swift),但是简单来说,一个表达式指向一个属性的一个目的。在这种情况下,对象是 Data
的一个元素(例如数组),而 属性 是任何 ID
(又名 Hashable
)。
selection
: 是一个Binding
。 Read more about bindings in SwiftUI, and more about property wrappers (a Binding is available via a @State
property wrapper)。但它基本上使您能够将状态变量传递给视图,以便它可以在不拥有数据的情况下更改状态变量。通过使用 $
前缀访问其投影值,绑定与 @State
包装的 属性 密切相关。请参阅下面的示例。
rowContent
: 是一个闭包,它接受所述 Data
的一个元素(例如数组的一个元素)和 returns 一个 RowContent
(又名一些 View
).暂时不用担心@ViewBuilder
。
5.
示例:
let strArray = ["One", "Two", "Three"]
@State var selection: String? = 0
// ...
List(strArray, id: \.self, selection: $selection, rowContent: { str in
return Text(str)
})
strArray
:是一个数组,所以满足Data
的泛型约束
\.self
:关键路径表达式,指向self(String,符合Hashable)
selection
:绑定到状态变量selection
。 $selection
是该变量的投影值,SwiftUI 方便地将其制成 Binding 类型。
rowContent
: 是对数组的每个元素的闭包和 returns 一个 Text
视图。
苹果软件的语法说明在哪里?例如,当我查找 SwiftUI 的 'List'(Xcode 中的 cmd-shift-0)时,我看到了其他选项:
init<Data, ID, RowContent>(Data, id: KeyPath<Data.Element, ID>, selection: Binding<Set<SelectionValue>>?, rowContent: (Data.Element)
-> RowContent)
太棒了!尖括号是什么意思? "RowContent" 与 "rowContent" 的意义是什么?等。我实际上写了什么来制作清单?这个语法的解释在哪里?
如果这是行业标准(我不这么认为)是什么标准?我不需要一个完全菜鸟的解释,但我需要比我拥有的更多的东西。
1.
如果您查看 List
的 Apple 文档,您的问题中有关于 init
函数的更多信息。
这里的格式如下:
// List declaration
struct List<SelectionValue, Content>
where
SelectionValue : Hashable,
Content : View
// init declaration
init<Data, ID, RowContent>(
_ data: Data,
id: KeyPath<Data.Element, ID>,
selection: Binding<SelectionValue?>?,
@ViewBuilder rowContent: @escaping (Data.Element) -> RowContent
) where
Content == ForEach<Data, ID, HStack<RowContent>>,
Data : RandomAccessCollection,
ID : Hashable,
RowContent : View
有点啰嗦,我同意。
2. 尖括号用于 Generics。这是一个大话题,您需要了解该语言才能继续。
简而言之,泛型是最终具体类型(String
、Int
、HStack
、Foo
等)的占位符将被使用,由该函数的用户定义。
通用占位符类型可以约束以符合特定的协议或继承自某个class。这是通过 where
子句完成的。
3. 所以,一个一个:
列表有 2 个占位符:SelectionValue
和 Content
(可以命名为任何名称,例如 <T, U>
):
struct List<SelectionValue, Content>
并且这些占位符受到限制:
where
SelectionValue : Hashable,
Content : View
它们分别被限制为符合 Hashable
和 View
。
所以,基本上,只要你在其函数定义中看到 Content
,就意味着它可以是 View
的任何实现。 SelectionValue
.
继续:
init<Data, ID, RowContent>
除了 List
声明的占位符之外,init
还泛化为大约三个额外的占位符:Data
、ID
和 RowContent
, 也受约束:
where
Content == ForEach<Data, ID, HStack<RowContent>>,
Data : RandomAccessCollection,
ID : Hashable,
RowContent : View
Content
:必须是 ForEach
(特定类型)。你实际上不应该关心它,因为 Content
不是 init
Data
:任何符合RandomAccessCollection
的类型,例如Array
ID
:任何符合Hashable
RowContent
: 任何符合 View
的类型 - 基本上任何 View
4. 现在,对于参数:
init<Data, ID, RowContent>(
_ data: Data,
id: KeyPath<Data.Element, ID>,
selection: Binding<SelectionValue?>?,
@ViewBuilder rowContent: @escaping (Data.Element) -> RowContent
)
_ data
:是 Data
类型的未标记参数,它(见上文)类似于数组
id
:是一个KeyPath
(也是一个你应该学习的topic of Swift),但是简单来说,一个表达式指向一个属性的一个目的。在这种情况下,对象是 Data
的一个元素(例如数组),而 属性 是任何 ID
(又名 Hashable
)。
selection
: 是一个Binding
。 Read more about bindings in SwiftUI, and more about property wrappers (a Binding is available via a @State
property wrapper)。但它基本上使您能够将状态变量传递给视图,以便它可以在不拥有数据的情况下更改状态变量。通过使用 $
前缀访问其投影值,绑定与 @State
包装的 属性 密切相关。请参阅下面的示例。
rowContent
: 是一个闭包,它接受所述 Data
的一个元素(例如数组的一个元素)和 returns 一个 RowContent
(又名一些 View
).暂时不用担心@ViewBuilder
。
5. 示例:
let strArray = ["One", "Two", "Three"]
@State var selection: String? = 0
// ...
List(strArray, id: \.self, selection: $selection, rowContent: { str in
return Text(str)
})
strArray
:是一个数组,所以满足Data
\.self
:关键路径表达式,指向self(String,符合Hashable)
selection
:绑定到状态变量selection
。 $selection
是该变量的投影值,SwiftUI 方便地将其制成 Binding 类型。
rowContent
: 是对数组的每个元素的闭包和 returns 一个 Text
视图。