看起来AppleScript知道特殊值null。
如何从基于 Cocoa 脚本的应用程序为可脚本化属性返回这样的值?
如果我从基于 Cocoa 脚本的应用程序返回 nil
( NULL
) 或 NSNull
的可脚本化属性获取器,脚本编辑器会将其解释为缺失值。
如果我返回[NSAppleEventDescriptor nullDescriptor]
,AppleScript甚至显示错误。
AppleScript 使用typeNull
描述符来表示未分配/无值,而missing value
则由cMissingValue
的typeType
描述符表示。(这类似于JavaScript中的undefined
与null
混乱,以及类似的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))
}
}