【问题标题】:Cocoa Scripting: Returning "null" vs. "missing value"Cocoa 脚本:返回“null”与“缺失值”
【发布时间】:2016-04-28 17:10:52
【问题描述】:

AppleScript 似乎知道特殊值 null

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

如果我从基于 Cocoa 脚本的应用程序中返回 nil (NULL) 或 NSNull 以获得可编写脚本的属性 getter,脚本编辑器会将其解释为 缺失值

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

【问题讨论】:

    标签: macos cocoa applescript cocoa-scripting


    【解决方案1】:

    我正在使用“null”的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()没有打了这个检查。输入 cMissingValue 即可。

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

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

    【讨论】:

    • 这是一个答案还是一个问题?看来您应该为此提出一个新问题。
    • 这是一个答案。
    【解决方案2】:

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

    【讨论】:

    • 你是说我应该可以从我的应用代码中返回一个空值吗?那怎么办?
    • 重点是:不要。 AppleScript 不能很好地处理“未定义”,坦率地说,就像 JS 的 undefined 一样,这是一个根本不应该引入的错误功能。使用'missing value',类似于JS的null;这就是它的用途。 typeNull 描述符只能用作对象说明符链中的根。 (虽然 AEM 定义了专用的 typeObjectBeingExaminedtypeCurrentContainer 类型来指示相对引用的根,但绝对引用,即相对于应用程序的根“应用程序”对象的引用,只使用 typeNull 来指示该根。)跨度>
    • 在 AppleScript 的 aeut 深处定义了一个 null 关键字,以及其他被破坏或无用的废话;不要用那个。不要把脚本语言当作 C 来考虑;它们不是:它们没有指针,所以它们也没有 C 风格的空指针。使用标准的missing value 对象来表示一个“省略”的值(参见JS 的null 对象、Python 的None 对象、Ruby 的nil 对象等),或者如果你的应用需要定义你自己的枚举/值类null 对自身具有特定含义的关键字(例如,如果您的应用是某种程序员工具)。
    • 这个问题与关于使用记录的链接问题有关。我希望能够让用户检查记录值是否不存在,并且“whose”子句似乎不适用于存在,所以我认为返回一个特殊值,例如 null,会有所帮助。我知道我可以使用我自己定义的另一个值,但如果我可以只使用 AS 中已经存在的“null”,那对我来说似乎是错误的。
    • 关于其他帖子,使用missing value 表示“空”属性。 Cocoa 脚本框架将(大部分)自动为您在nilmissing value 之间架起桥梁。 whose 子句应该能够过滤您元素的 owner 属性,例如tell application "Contacts" to every person whose organization = missing value。我建议您在此处发布 sdef 和代码的相关部分,和/或编写简单的测试用例以缩小范围;虽然 CS 不乏其自身的错误和缺点,但您应该首先确保它不是您的实现中的东西。
    猜你喜欢
    • 2014-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多