我想使用以下代码来获取 Mail.app 中可用的电子邮件帐户的列表。
import Foundation
struct EmailAccounts {
func getAccountNames() -> [String] {
let appleScriptSource = """
tell application "Mail"
set accountDict to {}
repeat with acc in accounts
set accName to name of acc
set accEmails to email addresses of acc
set accountDict's end to {accName:accEmails}
end repeat
return accountDict
end tell
"""
var error: NSDictionary?
var accountNames: [String] = []
if let scriptObject = NSAppleScript(source: appleScriptSource) {
let scriptResult = scriptObject.executeAndReturnError(&error)
if let listDescriptor = scriptResult.coerce(toDescriptorType: typeAEList) {
for index in 1...listDescriptor.numberOfItems {
if let listItemString = listDescriptor.atIndex(index)?.stringValue {
accountNames.append(listItemString)
}
}
}
}
return accountNames
}
}
调试,建议
scriptResult.coerce(toDescriptorType: typeAEList)
计算为 nil
,因为下面设置的断点在循环内不会被命中。
AppleScript 进行评估时不会出现问题,返回帐户名称和关联电子邮件地址的列表
tell application "Mail"
set accountInfoList to {}
repeat with acc in accounts
set accName to name of acc
set accEmails to email addresses of acc
set end of accountInfoList to {accName, accEmails}
end repeat
return accountInfoList
end tell
问题:如何利用
scriptResult
对象来获得表示通过 AppleScript 获得的输出的字符串数组?
目前我忽略了这样一个事实:输出应该被视为一个嵌套数组,其中多个电子邮件地址附加到一个帐户,但我可以稍后处理这个小问题。
scriptResult
已经是一个列表;你不能强迫它。只需继续并开始将其作为列表处理即可:
for index in 1...scriptResult.numberOfItems {
print(scriptResult.atIndex(index)?.isRecordDescriptor)
}
这将向您证明您拥有的记录列表与帐户数量一样多。现在继续处理您的“小问题”,即如何从每条记录中获取信息。