2

我有一个复杂的 AppleScript,它返回我需要从 Swift 访问的字符串列表。我把它归结为一个简单的例子,我只是不知道如何将 AppleScript 字符串映射到 Swift 字符串数组。

let listOfStringsScript = """
                          set listOfStrings to { "one", "two", "three" }
                          """

 if let scriptObject = NSAppleScript(source: listOfStringsScript) {
    var errorDict: NSDictionary? = nil
    let resultDescriptor = scriptObject.executeAndReturnError(&errorDict)

    if errorDict == nil {
      // TODO: convert the resultDescriptor (NSAppleEventDescriptor) into an array of strings
      print(resultDescriptor)
      // OUTPUT: <NSAppleEventDescriptor: [ 'utxt'("one"), 'utxt'("two"), 'utxt'("three") ]>
    }
}
4

2 回答 2

2

在@Alexander 和@MartinR 的帮助下回答:

extension NSAppleEventDescriptor {

  func toStringArray() -> [String] {
    guard let listDescriptor = self.coerce(toDescriptorType: typeAEList) else {
      return []
    }

    return (0..<listDescriptor.numberOfItems)
      .compactMap { listDescriptor.atIndex($0 + 1)?.stringValue }
  }

}

...

let resultDescriptor = scriptObject.executeAndReturnError(&errorDict)
let subjectLines = resultDescriptor.toStringArray()
于 2019-04-06T18:05:32.267 回答
1

另一种方法是将 Apple Script 结果收集为由换行符分隔的文本行,然后在 Swift 中解析字符串。

因此,使用分解 Apple Script 结果

set AppleScript's text item delimiters to linefeed

然后简单解析

let selectedItems = scriptExecuted.stringValue!
let selectedItemsFiltered = selectedItems.components(separatedBy: .newlines)

.components返回一个字符串数组

于 2021-04-14T05:39:08.887 回答