Невозможно развернуть NSAppleEventDescriptor в SWIFT
У меня есть Applescript, который дает мне результат. Но я не могу развернуть значение в строку, чтобы я мог использовать его.
var set: String = "set windowTile to \"\"\n"
var tell: String = "tell application \"System Events\"\n"
var setFrontApp: String = "set frontApp to first application process whose frontmost is true\n"
var setFrontAppName: String = "set frontAppName to name of frontApp\n"
var tellProcces: String = "tell process frontAppName\n"
var tellFirst: String = "tell (1st window whose value of attribute \"AXMain\" is true)\n"
var setWindowTitle: String = "set windowTitle to value of attribute \"AXTitle\"\n"
var endTellFirst: String = "end tell\n"
var endTellProcess: String = "end tell\n"
var endTell: String = "end tell"
var startAtLoginScript: NSAppleScript = NSAppleScript(source: set + tell + setFrontApp + setFrontAppName + tellProcces + tellFirst + setWindowTitle + endTellFirst + endTellProcess + endTell)
var scriptResult:NSAppleEventDescriptor = startAtLoginScript.executeAndReturnError(errorInfo)!
NSLog ("%@", scriptResult)
NSLog выглядит так:
2015-03-14 15:15:14.001 test[7315:161881]
<NSAppleEventDescriptor:'utxt'("test.swift")>
Фактическим результатом является строка "test.swift". Как я могу развернуть / проанализировать этот результат?
Я попытался добавить это:
var number:Int = 1
let result = scriptResult.descriptorAtIndex(number)
Также я попробовал использовать метод descriptorForKeyword(<#keyword: AEKeyword#>)
но я не знаю, чтобы установить AEKeyword.
2 ответа
Ты можешь использовать if…let
синтаксис для одновременной проверки результата nil
и разверните его, если он имеет значение.
descriptorAtIndex
не получит то, что вы хотите, потому что дескриптор не содержит utxt
вход - это utxt
запись (вы можете увидеть это, распечатав result.descriptorType
который даст вам код с четырьмя символами для "utxt"). Так stringValue
должен получить значение простой строки, но это необязательно, поэтому вы можете развернуть в том же let
,
Если вы хотите только вывести данные, println
будет делать это без отметки времени и т. д. (на самом деле NSLog
также записывает ошибку в консоль, которую вы, вероятно, не хотите)
import Foundation
let script = "\n".join([
"set windowTile to \"\"",
"tell application \"System Events\"",
"set frontApp to first application process whose frontmost is true",
"set frontAppName to name of frontApp",
"tell process frontAppName",
"tell (1st window whose value of attribute \"AXMain\" is true)",
"set windowTitle to value of attribute \"AXTitle\"",
"end tell",
"end tell",
"end tell",
])
var errorInfo: NSDictionary?
if let script = NSAppleScript(source: script),
let result = script.executeAndReturnError(&errorInfo),
let text = result.stringValue {
println(text)
}
else if let error = errorInfo {
println(error)
}
else {
println("Unexpected error while executing script")
}
scriptResult.stringValue()
, может быть? (Я не пользуюсь Swift много.)