2014-07-22 15 views
16

Cách tôi biết tôi có thể xem các phiên bản Swift được dịch tự động của các API Cocoa là bằng cách bấm vào lệnh một loại Cocoa trong Xcode. Ví dụ: dưới đây là những gì được tạo cho UITableViewController:Làm cách nào để truy xuất các tệp "tiêu đề" Swift cho các API Cocoa?

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! 
} 

Có cách nào khác để làm cho Xcode tạo phiên bản Swift này không? Tốt hơn là từ dòng lệnh?

Trả lời

13

Swift REPL bao gồm một helper :print_decl <name> - print the AST representation of the named declarations

blog post này giải thích làm thế nào bạn có thể viết một kịch bản đơn giản để giúp bạn sử dụng để tạo ra tài liệu cho một loại hình cụ thể. Tôi cập nhật các kịch bản cho phép sử dụng một trong hai hệ điều hành 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 

Lưu ý 1: Các giá trị mặc định kịch bản để sử dụng iOS SDK. Nếu bạn muốn sử dụng SDK OS X, hãy sử dụng tùy chọn "--osx" làm thông số đầu tiên

Lưu ý 2: Tôi muốn loại bỏ đầu ra tệp là một phần của bài đăng trên blog để tôi có thể sử dụng tập lệnh này theo những cách khác ngoài việc tạo tệp

+0

Thú vị rằng đầu ra có vẻ khác biệt rõ rệt so với những gì Xcode lãm. Ngoài ra, điều này có thể được sử dụng để xem các định nghĩa ẩn như '_Collection'. – jtbandes

+1

không hoạt động trong Xcode 6 beta 6 – user102008

+1

Có các nhận xét về bài đăng trên blog của [Erica Sadun] (https://www.instapaper.com/read/499591307) về cách nhận lệnh làm việc theo beta 6 và cách kết xuất các phiên bản UIKit là tốt. –

4

Như đã nêu trong this question, "tiêu đề" được tạo từ các mô-đun Swift đã biên dịch. Các địa điểm này nằm ở số /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/ nơi có cả các tệp swiftdocswiftmodule cũng như các số dylib có chứa các thư viện thực.

Dường như không có bất kỳ công cụ nào để phân tích cú pháp này vào lúc này. class-dumpotool không được sử dụng. Sau khi điều tra, có vẻ như Xcode giao tiếp với SourceKitService (đặt tại số ...XcodeDefault.xctoolchain/usr/lib/sourcekitd.framework/XPCServices/SourceKitService.xpc ) qua XPC để nhận các tiêu đề này - cách tiếp cận tốt nhất có thể là thử và sao chép các thông báo đó cho chính bạn. Tạo một công cụ DTrace trong Instruments, bạn có thể thấy một chút về những gì đang xảy ra (điều này là khi tôi -clicked trên CIFilter):

dtrace

Và với otool chúng ta có thể thấy rằng SourceKitService có những biểu tượng chẳng hạn như SwiftInterfaceGenContextswift::ide::SyntaxModelWalker có thể liên quan đến tất cả điều này. Nhưng phải mất rất nhiều công sức để giải quyết chính xác thông điệp nào đang được chuyển và cách bạn có thể tự mình lấy được tiêu đề. Có lẽ không đáng!

Chỉnh sửa: câu trả lời của drewag ở trên cho thấy rằng lệnh swift -integrated-repl 's :print_decl có thể tạo tiêu đề.

5

Hóa ra REPL hiện đại (không được chấp nhận) cũng có cách thực hiện điều này. Thay vì :print_module, bạn có thể sử dụng :type lookup:

echo -e "import CoreGraphics\n:type lookup CoreGraphics" | swift 
Các vấn đề liên quan