有没有办法找到实际的SwiftUI API文档(而不仅仅是开发人员文档)?

时间:2019-06-10 14:59:25

标签: swift swiftui

我目前正在观看WWDC 2019的SwiftUI Essentials视频,演示者提出了VStack的实际API,(至少,对我而言,这令人难以置信)详细介绍了此特定结构的实际工作方式。

开发人员是否可以找到有关Apple提供的特定功能的这类详细,深入的文档?

马特·史蒂文斯(Matt Stevens)拥有一个很棒的APIdiff(http://codeworkshop.net/objc-diff/sdkdiffs/)网站,但该网站都链接回了Apple的标准开发人员文档页面。

演示者提供的示例代码:

public struct VStack<Content : View> : View {
     public init(
          alignment: HorizontalAlignment = .center,
          spacing: Length? = nil,
          @ViewBuilder content: () -> Content
     )
}

实际提供的文档代码:

struct VStack<Content> where Content : View

上面关于对齐默认值的详细信息以及单独的间距长度虽然非常简单,但是已经作为整个站点中的单独SO问题被问及关于默认行为是什么以及为什么是默认行为的原因。

我想我要问的是,例如,对于UIKit中当前的,更完善的类,是否可以查看该类本身的实际实现细节,例如在SwiftDC VStack的此WWDC中显示的?我不确定这是苹果公司从未提供过的信息,还是人们随着时间的推移而学到的信息(这种行为以某种方式“只是因为”,而我们从经验中知道),或者这仅仅是事实, SwiftUI是新功能,Apple还没来得及巩固SwiftUI和文档。

很抱歉,如果有人问过这个问题,或者这是一个非常明显的问题,我对软件开发整体还是很陌生的。

谢谢!

2 个答案:

答案 0 :(得分:3)

您从该演示文稿中显示的内容不是实施细节。这是init的公用VStack方法。请注意,它没有方法主体-它不是init方法的实现,只是它的类型签名。

您可以在“创建堆栈”目标下找到与the VStack documentation链接的相同信息。这是the documentation page for that init method

您还可以在Xcode中看到这样的方法签名以及文档注释(如果有)。

在Xcode 11中,从菜单栏中选择“文件”>“快速打开...”(默认快捷方式:⇧⌘O)。在“快速打开”栏中键入“ swiftui”:

open quickly bar with swiftui

打开“ SwiftUI.h”。没多说:

// Copyright © 2015 Apple Inc. All rights reserved.

#import <AppKit/AppKit.h>

现在单击编辑器左上角的“相关项”图标,然后从菜单中选择“生成的接口”>“ SwiftUI”:

SwiftUI under Related Items menu

然后,在编辑器顶部的跳转栏中单击“ SwiftUI”右侧的“无选择”,并在打开跳转菜单时键入“ vstack”:

finding vstack in the jump menu

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符合{{ 1}}。 (The reference documentation也没有提及。)

生成的接口和参考文档都没有告诉我们View不符合VStack的原因是因为View不直接符合VStackView符合VStack,并且_UnaryView_UnaryView的子协议。

通过跟踪模块的View文件,您可以看到VStack的真实,坦诚的公共接口,即您的源代码导入SwiftUI时编译器实际使用的接口。您可以在相对于.swiftinterface的此路径中找到它:

  

内容/开发人员/平台/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks/SwiftUI.framework/Modules/SwiftUI.swiftmodule/arm64.swiftinterface

(因此,如果尚未重命名Xcode 11 beta并将其放在Xcode.app中,请在该路径的前面放置/Applications/Xcode-beta.app/。)

如果在该文件中搜索/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的真实公共接口,则需要同时搜索{{1 }}和Color

答案 1 :(得分:1)

现在,SwiftUI上的文档非常稀疏。但是我想它会在官方和辅助来源下继续增长和改进。

以下是我现在要使用的主要资源:

您还可以从Xcode 11.0 beta shift+command 0中查看文档,并在SwiftUI下拉菜单下查看。