Как я могу получить файлы заголовков Swift для API Cocoa?

Как я знаю, я могу просмотреть автоматически переведенные версии Swift для API Cocoa, нажав кнопку Cocoa в Xcode. Например, вот что создано для UITableViewController:

class UITableViewController : UIViewController, UITableViewDelegate, NSObjectProtocol, UIScrollViewDelegate, UITableViewDataSource {

    init(style: UITableViewStyle)

    var tableView: UITableView!
    var clearsSelectionOnViewWillAppear: Bool // defaults to YES. If YES, any selection is cleared in viewWillAppear:

    var refreshControl: UIRefreshControl!
}

Есть ли альтернативный способ заставить Xcode генерировать эту версию Swift? Предпочтительно из командной строки?

Ответы

Ответ 1

Swift REPL включает вспомогательный :print_decl <name> - print the AST representation of the named declarations

В этом сообщении в блоге объясняется, как вы можете написать простой script, чтобы помочь вам использовать его для создания документации для определенного типа. Я обновил script, чтобы разрешить использование OS X

#! /bin/sh
# usage: <shellscript> [--osx] typename

if [ "$1" = "--osx" ] ; then
    echo "import Cocoa\n:print_decl $2" | xcrun swift -deprecated-integrated-repl
else
    sdk_path=$(echo `xcrun --show-sdk-path` | sed 's#MacOSX.platform/Developer/SDKs/MacOSX10.10.sdk#iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator8.0.sdk#')
    echo "import UIKit\n:print_decl $1" | xcrun swift -deprecated-integrated-repl -sdk "$sdk_path"
fi

Примечание 1: По умолчанию используется script с помощью SDK iOS. Если вы хотите использовать OS X SDK, используйте параметр "--osx" в качестве первого параметра

Примечание 2: Я предпочитаю оставить файл, который является частью сообщения в блоге, так что я могу использовать этот script другими способами, чем просто создание файлов

Ответ 2

Получается, что современный (не "устаревший" ) REPL имеет способ сделать это тоже. Вместо :print_module вы можете использовать :type lookup:

echo -e "import CoreGraphics\n:type lookup CoreGraphics" | swift

Ответ 3

Как отмечено в этом вопросе, "заголовки" генерируются из скомпилированных модулей Swift. Они расположены в /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/, где есть как файлы swiftdoc, так и swiftmodule, а также dylib, содержащие фактические библиотеки.

В настоящее время, похоже, нет никаких инструментов для их анализа. class-dump и otool бесполезны. После некоторого расследования кажется, что Xcode связывается с SourceKitService (расположенным под ...XcodeDefault.xctoolchain/usr/lib/sourcekitd.framework/XPCServices/SourceKitService.xpc ) через XPC, чтобы получить эти заголовки - лучший подход, вероятно, состоял бы в том, чтобы попытаться дублировать эти сообщения для себя. Создание инструмента DTrace в инструментах, вы можете увидеть немного о том, что происходит (это когда я -clicked на CIFilter):

dtrace

И с otool мы видим, что SourceKitService имеет символы, такие как SwiftInterfaceGenContext и swift::ide::SyntaxModelWalker, которые, вероятно, связаны со всем этим. Но потребуется много работы, чтобы понять, какие сообщения передаются и как вы можете получить заголовки самостоятельно. Наверное, не стоит!

Изменить: ответ drewag выше показывает, что команда swift -integrated-repl :print_decl может создавать заголовки.