2016-09-29 39 views
1

這是我在Xcode 7.3.1使用的代碼,並且工作得很好:ScriptingBridge代碼中的錯誤並迅速3.0

var selectedFiles = NSMutableArray(capacity:1) 
    let finder: AnyObject! = SBApplication(bundleIdentifier:"com.apple.finder") 
    let finderObject = finder.selection as! SBObject 
    let selection: AnyObject! = finderObject.get() 
    let items = selection.arrayByApplyingSelector(Selector("URL")) 

    let filteredfiles = (items as NSArray).pathsMatchingExtensions(["ai","pdf","ap","paf","pafsc"]) 
    for item in filteredfiles { 
     let url = NSURL(string:item ,relativeToURL:nil) 
     selectedFiles.addObject(url!) 
    } 

這是Xcode的8.0修正代碼並不起作用: 最後一行生成錯誤

error =無法調用非函數類型的值[[Any]!'

var selectedFiles = NSMutableArray(capacity:1) 
    let finder: AnyObject! = SBApplication(bundleIdentifier:"com.apple.finder") 
    let finderObject = finder.selection as! SBObject 
    if let selection = finderObject.get() as AnyObject?{ 
     let items = selection.array(#selector(getter: NSTextCheckingResult.url)) 
     let filteredfiles = (items as NSArray).pathsMatchingExtensions(["ai","pdf","ap","paf","pafsc"]) 
     for item in filteredfiles { 
      let url = NSURL(string:item ,relativeToURL:nil) 
      selectedFiles.addObject(url!) 
     } 
    } 

我已經嘗試了很多解決方案,但不幸找不到線索。 我想這是因爲Swift 3.0x API已經徹底改變了.... 歡迎任何幫助!

回答

1

這是使用一對夫婦的原生斯威夫特功能稍微不同的方法對雨燕3

var selectedFiles = [URL]() 
let finder : AnyObject = SBApplication(bundleIdentifier:"com.apple.finder")! 
let finderObject = finder.selection as! SBObject 
if let selection = finderObject.get() as? [SBObject] { 
    selection.forEach { item in 
     let url = URL(string: item.value(forKey:"URL") as! String)! 
     selectedFiles.append(url) 
    } 

    let goodExtensions = ["ai","pdf","ap","paf","pafsc"] 
    let filteredURLs = selectedFiles.filter({goodExtensions.contains($0.pathExtension)}) 
    print(filteredURLs) 
} 

PS:我強烈建議使用AppleScriptObjC。它使用起來非常簡單。

PPS:valueForKey是故意使用的,因爲KVC確實需要獲取屬性值。

+0

感謝您閃電般的快速回答。它工作得很好。我曾經用AppleScriptObjC製作我的項目,但我在大多數情況下嘗試使用本機Swift和其他幫助器。有時候這是不可能的! –

+0

民間推薦使用AppleScriptObjC的原因是ScriptingBridge充滿了缺陷和殘缺/缺少的功能,而不是導致很多在AS中完美工作的命令在SB中失敗。也就是說,由於Swift的輸入更嚴格,兩者在Swift中的使用比ObjC更加費力。 FWIW我目前正在開發一個原生的[Swift-to-AppleEvent橋](https://bitbucket.org/hhas/swiftae),作爲AppleScript的一個真正的Swift友好型替代品,歡迎您使用,儘管注意我對它的長期支持將取決於蘋果/ Swift開發者能夠吸引多少支持。 – foo

+0

關於「強烈推薦使用AppleScriptObjC'」,Swift AppleScriptObjC選擇器的實現看起來像什麼?在不添加任何Objective-C或AppleScript代碼的情況下,Swift的AppleScriptObjC實現是否可能? –