2016-09-29 10 views
1

이것은 내가 엑스 코드 7.3.1에 사용 된 코드는 그 괜찮 았는데 :이 엑스 코드 8.0 보정 코드가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!) 
    } 

하고 문제가 해결되지 않습니다 마지막 줄에 오류가 발생했습니다.

오류 = 비 기능 유형 '[모두]의 값을 호출 할 수 없습니다!'

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

나는 많은 해결책을 시도했지만 불행히도 단서를 찾을 수 없습니다. 스위프트 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의 훨씬 엄격한 타이핑 때문에 ObjC보다 Swift에서 사용하기가 더 까다 롭습니다. FWIW 저는 AppleScript에 대한 진정한 신속하고 친근한 대안 인 네이티브 [Swift-to-AppleEvent 브리지] (https://bitbucket.org/hhas/swiftae)를 개발 중입니다. 내 장기간의 지원은 Apple/Swift 개발자들 사이에서 얼마나 많은 지원이 이루어질 수 있는지에 달려 있습니다. – foo

+0

"AppleScriptObjC를 사용하는 것이 좋습니다"와 관련하여 Swift의 AppleScriptObjC selectedFinderFiles 구현은 어떻게 생겼을까요? Objective-C 나 AppleScript 코드를 추가하지 않고도 신속한'AppleScriptObjC' 구현이 가능합니까? –