init()の宣言の下の{}を省略する方法
イニシャライザを変数宣言を簡略化するために用いようとして、構造体の中にイニシャライザを宣言しました。
しかし**{body}**が必要だという以下のようなエラーメッセージが出ます。
エラーメッセージ
以下のSwiftUIのコードを模範にしてイニシャライザを宣言しました。
###OutlineGroup()の宣言の確認方法
OutlineGroupを宣言してJump to Definitionを選択するとソースコードを確認できます。
###OutlineGroup()の抜粋
Swift
1public struct OutlineGroup<Data, ID, Parent, Leaf, Subgroup> where Data : RandomAccessCollection, ID : Hashable { 2} 3 4extension OutlineGroup where ID == Data.Element.ID, Parent : View, Parent == Leaf, Subgroup == DisclosureGroup<Parent, OutlineSubgroupChildren>, Data.Element : Identifiable { 5 6public init<DataElement>(_ root: DataElement, children: KeyPath<DataElement, Data?>, @ViewBuilder content: @escaping (DataElement) -> Leaf) where ID == DataElement.ID, DataElement : Identifiable, DataElement == Data.Element 7 8public init<DataElement>(_ data: Data, children: KeyPath<DataElement, Data?>, @ViewBuilder content: @escaping (DataElement) -> Leaf) where ID == DataElement.ID, DataElement : Identifiable, DataElement == Data.Element 9}
SwiftUIのコードと比較すると、Genericsに適用するプロトコルの有無が相違点として確認できましたので、Genericsに適用するプロトコルが関係していると考え、主にGenericsについてのswiftのリファレンスを調べましたが明確な答えが分かりませんでした。
変数を簡素化して宣言するのにイニシャライザを用いるのが適切であるか、その場合、上記のようなエラーの解消する方法の解説をお願い致します。
SwiftUI のソースコードはどこから入手されましたか?
XcodeでOutlineGroupを宣言して”Jump to Definition”でソースコードを閲覧しました。
以下のリンクからドキュメントを確認できます
https://developer.apple.com/documentation/swiftui/outlinegroup
SwiftUI (や UIKit など) のソースは公開されてませんので、Jump to Definition で確認できるのは、いわゆる宣言部分というか、関数の body 部分は省略したものだけのはず…。
Swift 言語仕様を確認する限り、initializer-body は省略不可だと思います。
https://docs.swift.org/swift-book/ReferenceManual/Declarations.html#grammar_initializer-declaration
ソースコードではないのですね。誤表現で困惑させてしまい申し訳ありませんでした。それらに付随する文章を修正しておきます。
自分で記述したコードのinitializer-body は省略不可なのですね。
Jump to Definitionで確認できる関数のbody部分(少なくともOutlineGroupのinitializer-bodyに関して)は省略してあるというような認識でよいのでしょうか?
だと思います。
勘違いしているかもしれないので書いておきます。
Jump to Definitionで表示されるのはGenerated Interfaceというもので、XcodeがライブラリやソースコードからInterface(structの宣言や関数の名前など)だけを抜き出して生成したものです。
ソースコードそのものではありません。
回答1件
あなたの回答
tips
プレビュー