如何通过 NSAppleScript 在 Mail.app 上正确运行 AppleScript 并将结果解析为字符串列表

问题描述 投票:0回答:1

我想使用以下代码来获取 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

Apple Script Results

问题:如何利用

scriptResult
对象来获得表示通过 AppleScript 获得的输出的字符串数组?


目前我忽略了这样一个事实:输出应该被视为一个嵌套数组,其中多个电子邮件地址附加到一个帐户,但我可以稍后处理这个小问题。

arrays swift struct applescript nsapplescript
1个回答
0
投票

scriptResult
已经是一个列表;你不能强迫它。只需继续并开始将其作为列表处理即可:

for index in 1...scriptResult.numberOfItems {
    print(scriptResult.atIndex(index)?.isRecordDescriptor)
}

这将向您证明您拥有的记录列表与帐户数量一样多。现在继续处理您的“小问题”,即如何从每条记录中获取信息。

© www.soinside.com 2019 - 2024. All rights reserved.