2014-07-22 6 views
16

जिस तरह से मुझे पता है मैं कोको एपीआई के स्वचालित रूप से अनुवादित स्विफ्ट संस्करण देख सकता हूं, एक्सकोड में कोको प्रकार को कमांड पर क्लिक करके। उदाहरण के लिए, यहाँ है 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 इस स्विफ्ट संस्करण उत्पन्न करने के लिए एक वैकल्पिक तरीका है? अधिमानतः कमांड लाइन से?

उत्तर

13

स्विफ्ट आरईपीएल एक सहायक :print_decl <name> - print the AST representation of the named declarations

यह blog post बताते हैं कि कैसे आप इस का उपयोग एक विशिष्ट प्रकार के लिए प्रलेखन उत्पन्न करने के लिए मदद करने के लिए एक सरल स्क्रिप्ट लिख सकते हैं शामिल हैं। स्क्रिप्ट चूक iOS SDK का उपयोग करने के लिए: मैं या तो ओएस एक्स

#! /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 अनुमति देने के लिए स्क्रिप्ट अपडेट किया गया। यदि आप ओएस एक्स एसडीके का उपयोग करना चाहते हैं तो पहले पैरामीटर के रूप में "--osx" विकल्प का उपयोग करें

नोट 2: मैं ब्लॉग पोस्ट का हिस्सा है जो फ़ाइल आउटपुट छोड़ना पसंद करता है ताकि मैं इसका उपयोग कर सकूं यह स्क्रिप्ट सिर्फ फाइल पीढ़ी

+0

दिलचस्प है कि उत्पादन क्या Xcode चलता से अलग लगता है। इसके अलावा, इसका उपयोग '_Collection' जैसी छिपी परिभाषाओं को देखने के लिए किया जा सकता है। – jtbandes

+1

एक्सकोड 6 बीटा 6 – user102008

+1

में काम नहीं करता है [बीका 6 के तहत काम कर रहे कमांड को कैसे प्राप्त करें और कैसे डंप करने के बारे में [एरिका सदन के ब्लॉग पोस्ट] (https://www.instapaper.com/read/499591307) पर टिप्पणियां हैं यूआईकिट संस्करण भी। –

4

जैसा कि this question में बताया गया है, "शीर्षलेख" संकलित स्विफ्ट मॉड्यूल से उत्पन्न होते हैं। ये /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/iphoneos/ पर स्थित हैं जहां swiftdoc और swiftmodule फ़ाइलें, साथ ही साथ dylib एस हैं जिनमें वास्तविक पुस्तकालय शामिल हैं।

उस समय इन्हें पार्स करने के लिए कोई उपकरण प्रतीत नहीं होता है। class-dump और otool कोई उपयोग नहीं है। कुछ जांच के बाद, ऐसा लगता है कि एक्सकोड इन हेडर प्राप्त करने के लिए एक्सपीसी के माध्यम से SourceKitService (...XcodeDefault.xctoolchain/usr/lib/sourcekitd.framework/XPCServices/SourceKitService.xpc पर स्थित) के साथ संचार करता है - सबसे अच्छा तरीका शायद आपके लिए उन संदेशों को आजमाने और डुप्लिकेट करना होगा। उपकरण में एक DTrace साधन बनाते समय, आप क्या हो रहा है का एक छोटा सा देख सकते हैं (यह है जब मैं CIFilter पर -clicked):

dtrace

और otool साथ हम देख सकते हैं कि SourceKitService प्रतीक हैं जैसे कि SwiftInterfaceGenContext और swift::ide::SyntaxModelWalker जो शायद इन सब से संबंधित हैं। लेकिन यह समझने के लिए बहुत सारे काम करेंगे कि वास्तव में कौन से संदेश पारित किए जा रहे हैं और आप हेडर को कैसे प्राप्त कर सकते हैं। शायद इसके लायक नहीं है!

संपादित करें: drewag का जवाब ऊपर से पता चलता है कि swift -integrated-repl के :print_decl आदेश हेडर उत्पादन कर सकते हैं।

5

की तुलना में अन्य तरीकों से है, यह आधुनिक (गैर-"बहिष्कृत") आरईपीएल को ऐसा करने का एक तरीका है। :print_module के बजाय, आप :type lookup उपयोग कर सकते हैं:

echo -e "import CoreGraphics\n:type lookup CoreGraphics" | swift 
संबंधित मुद्दे

 संबंधित मुद्दे