我有一个复杂的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") ]>
}
}
答案 0 :(得分: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
返回一个字符串数组
答案 1 :(得分:0)
在@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()