То, что вы показали из этой презентации, не является деталью реализации.Это публичный init
метод VStack
.Обратите внимание, что у него нет тела метода - это не реализация метода init
, а только сигнатура его типа.
Вы можете найти ту же информацию, связанную с документацией VStack
под целью «Создание стека».Вот страница документации для этого init
метода .
Вы также можете увидеть подписи методов, подобные этой, с комментариями к документу, если они есть, в Xcode.
InXcode 11, выберите «Файл»> «Быстро открыть» в строке меню (ярлык по умолчанию: ⇧⌘O ).Введите «swiftui» на панели быстрого доступа:
![open quickly bar with swiftui](https://i.stack.imgur.com/lva3n.png)
Откройте «SwiftUI.h».Это ничего не говорит:
// Copyright © 2015 Apple Inc. All rights reserved.
#import <AppKit/AppKit.h>
Теперь щелкните значок «Связанные элементы» в верхнем левом углу редактора и выберите «Сгенерированный интерфейс»> «SwiftUI» в меню:
![SwiftUI under Related Items menu](https://i.stack.imgur.com/h3aJJ.png)
Затем нажмите «Без выбора» справа от «SwiftUI» в панели перехода в верхней части редактора и введите «vstack», когда открыто меню перехода:
![finding vstack in the jump menu](https://i.stack.imgur.com/eA9Mn.gif)
XCode переходит к определению struct VStack
:
/// A view that arranges its children in a vertical line.
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
public struct VStack<Content> where Content : View {
/// Creates an instance with the given `spacing` and Y axis `alignment`.
///
/// - Parameters:
/// - alignment: the guide that will have the same horizontal screen
/// coordinate for all children.
/// - spacing: the distance between adjacent children, or nil if the
/// stack should choose a default distance for each pair of children.
@inlinable public init(alignment: HorizontalAlignment = .center, spacing: Length? = nil, content: () -> Content)
/// 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.
public typealias Body = Never
}
К сожалению, это (обобщенное) объявление пропускает @ViewBuilder
атрибут в аргументе content
.Это упущение, вероятно, является ошибкой.
В дополнение к пропущенным аннотациям, сгенерированный интерфейс Swift также пропускает типы, методы и свойства, которые начинаются с _
.(Он пропускает их, потому что они считаются деталями реализации, которые по любой причине должны быть обнародованы.) Например, обратите внимание, что сгенерированный интерфейс VStack
также не упоминает, что VStack
соответствует View
.( Справочная документация также не упоминает об этом.)
Причина, по которой сгенерированный интерфейс и справочная документация не говорят нам VStack
соответствует View
, заключается в том, чтоVStack
не соответствует непосредственно View
.VStack
соответствует _UnaryView
, а _UnaryView
является подпротоколом View
.
Вы можете увидеть настоящий, честный для публики интерфейс VStack
- то, что на самом деле использует компиляторкогда ваш исходный код импортирует SwiftUI - путем отслеживания файла .swiftinterface
для модуля.Вы можете найти его по этому пути относительно вашего Xcode.app
:
Contents / Developer / Platforms / iPhoneOS.platform / Developer / SDKs / iPhoneOS.sdk / System / Library / Frameworks / SwiftUI.framework / Modules / SwiftUI.swiftmodule / arm64.swiftinterface
(Итак, поместите /Applications/Xcode-beta.app/
в начало этого пути, если вы не переименовали бета-версию Xcode 11 и поместите ее в /Applications
).
Если вы выполните поиск этого файла по struct VStack
, вы найдете настоящий открытый интерфейс VStack
:
@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
@_fixed_layout public struct VStack<Content> : _UnaryView where Content : SwiftUI.View {
@usableFromInline
internal var _tree: _VariadicView.Tree<_VStackLayout, Content>
@inlinable public init(alignment: HorizontalAlignment = .center, spacing: Length? = nil, @SwiftUI.ViewBuilder content: () -> Content) {
_tree = .init(
root: _VStackLayout(alignment: alignment, spacing: spacing), content: content())
}
public static func _makeView(view: _GraphValue<VStack>, inputs: _ViewInputs) -> _ViewOutputs
public static func _makeViewList(view: _GraphValue<VStack>, inputs: _ViewListInputs) -> _ViewListOutputs
public typealias Body = Swift.Never
}
Обратите внимание, что файл .swiftinterface
не консолидируетсярасширения.VStack
не имеет никаких расширений, но (например) Color
имеет, поэтому, если вы хотите увидеть истинный общедоступный интерфейс Color
, вам нужно искать как struct Color
, так и extension Color
.