可可脚本:返回"null"与 "missing value"



看起来AppleScript知道特殊值null

如何从基于 Cocoa 脚本的应用程序为可脚本化属性返回这样的值?

如果我从基于 Cocoa 脚本的应用程序返回 nilNULL ) 或 NSNull 的可脚本化属性获取器,脚本编辑器会将其解释为缺失值

如果我返回[NSAppleEventDescriptor nullDescriptor],AppleScript甚至显示错误。

AppleScript 使用typeNull描述符来表示未分配/无值,而missing value则由cMissingValuetypeType描述符表示。(这类似于JavaScript中的undefinednull混乱,以及类似的PITA。

我使用的是"null"的cMissingValue版本,如下所示:

NSAppleEventDescriptor(typeCode: UInt32(cMissingValue))

我决定根据下面的测试使用它。

我正在使用 Swift 运行参数并将其传递给 AppleScript 子例程,使用下面的代码:

将变量传递给 AppleScript

let parameters = NSAppleEventDescriptor.list()
let null         = NSAppleEventDescriptor.null()
let missingValue = NSAppleEventDescriptor(typeCode: UInt32(cMissingValue))
parameters.insert(null, at: 0)
parameters.insert(missingValue, at: 0)
return parameters

这些参数被传递给AppleScript子例程,我已经注释了每个结果:

on nilTest(paramNull, paramMissingValue)
    display dialog paramNull buttons {"OK"} # execution error: Can’t make current application into type string. (-1700)
    display dialog paramMissingValue buttons {"OK"} #"msng"
    display dialog "" & paramNull buttons {"OK"} #"current application"
    display dialog "" & paramMissingValue buttons {"OK"} #"missing value"
end nilTest

由于某种原因,NSAppleEventDescriptor.null()版本似乎正在获取"当前应用程序"值。

似乎我可能想使用另一个答案中显示的cMissingValue

变量可以在AppleScript中进行零检查,如下所示:

if yourVar is missing value then
    display dialog "is missing value" buttons {"OK"}
end if

NSAppleEventDescriptor.null()没有命中此检查。键入cMissingValue可以。

我已将其添加为 Swift 扩展:NSAppleEventDescriptor.missingValue()

extension NSAppleEventDescriptor {
    static func missingValue() -> NSAppleEventDescriptor {
        return NSAppleEventDescriptor(typeCode: UInt32(cMissingValue))
    }
}

相关内容

  • 没有找到相关文章

最新更新