Как я могу получить файлы заголовков 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
может создавать заголовки.