Cocoa脚本:返回“null”与“missing value”

时间:2016-04-28 17:10:53

标签: macos cocoa applescript cocoa-scripting

AppleScript似乎知道特殊值 null

如何从基于Cocoa Scripting的应用程序返回这样的值以获取可编写脚本的属性?

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

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

2 个答案:

答案 0 :(得分:1)

AppleScript使用typeNull描述符指示未分配/无值,而missing valuetypeType描述符cMissingValue表示。 (它类似于JavaScript中的undefined vs null混乱,以及类似的PITA。)

答案 1 :(得分:1)

根据下面的测试,我正在使用cMissingValue版的“空”。

NSAppleEventDescriptor(typeCode: UInt32(cMissingValue))

我正在使用Swift运行并通过以下代码将参数传递给AppleScript子例程:

Passing variables to an 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() not 没打过这张支票。输入cMissingValue即可。

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

extension NSAppleEventDescriptor {

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

}