Сценарии Какао: возвращение "ноль" против "пропущенного значения"

Похоже, что AppleScript знает специальное значение null.

Как я могу вернуть такое значение из моего приложения на основе сценариев Какао для свойства сценариев?

Если я вернусь nil (NULL) или же NSNull для получателя свойств сценариев из моего приложения на основе сценариев Cocoa редактор сценариев интерпретирует это как отсутствующее значение.

И если я вернусь [NSAppleEventDescriptor nullDescriptor], AppleScript даже показывает ошибку.

2 ответа

AppleScript использует typeNull дескриптор для указания неназначенного / без значения, тогда как missing value представлен typeType дескриптор cMissingValue, (Это аналогично undefined против null беспорядок в JavaScript и аналогичный PITA.)

Я использую cMissingValue версия "null", основанная на тестировании ниже.

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))
    }

}
Другие вопросы по тегам