2017-01-05 13 views
0

В AppleScript Я пытаюсь узнать, как проверить значение элементов списка, но когда я пытаюсь проверить, является ли элемент целым, я получаю неточные результаты. Сначала я ссылка Apple's Automation scripting guide в разделе Определения, если список содержит конкретный пункт:AppleScript проверяет, является ли значение элемента списка целым числом

property one : 1 
property two : 2 
property three : 3 
property bad : 4 

my checkProperty() 

on checkProperty() 
    tell application "Finder" 
     set someList to {one, two, three, bad} 
     if someList contains string then 
      display dialog "good" 
     else 
      display dialog "not numerical" 
     end if 
    end tell 
end checkProperty 

Когда я выполняю это я получаю not numerical хотя каждый элемент представляет собой целое число. Если я ссылаться Applescript, converting every item in list to integer и выполнить:

property one : 1 
property two : 2 
property three : 3 
property bad : "bad" 

my checkProperty() 

on checkProperty() 
    tell application "Finder" 
     set someList to {one, two, three, bad} 
     repeat with theItem from 1 to length of someList 
      set item theItem of someList to (item theItem of someList as integer) 
      if theItem is integer then 
       display dialog theItem 
      else 
       display dialog "not numerical" 
      end if 
     end repeat 
    end tell 
end checkProperty 

Он работает до тех пор, последняя запись из списка (bad) и ошибок из так theItem не может преобразовать строку в целое число. Поиск по SO я натыкался Check if variable is number: Applescript и попытался принятый ответ с number:

property one : 1 
property two : 2 
property three : 3 
property bad : "bad" 

my checkProperty() 

on checkProperty() 
    tell application "Finder" 
     set someList to {one, two, three, bad} 
     repeat with theItem from 1 to length of someList 
      if class of theItem is number then 
       display dialog theItem 
      else 
       display dialog "not numerical" 
      end if 
     end repeat 
    end tell 
end checkProperty 

но когда сценарий побежал он возвращает not numerical для каждого элемента. Если я пытаюсь второй ответ, который использует integer:

if class of theItem is integer then 
    display dialog theItem 
else 
    display dialog "not numerical" 
end if 

Я получаю возвращенное индивидуальный диалог для подсчета записей. Как проверить значение элемента списка в AppleScript, чтобы увидеть, является ли это целым числом или строкой, не вызывая ошибки?

ответ

0

Чтобы проверить, если все элементы в списке определенный тип:

to isListOfType(theList, theType) 
    return (count {theList} each list) = 1 ¬ 
     and (count theList each theType) = (count theList) 
end isListOfType 

isListOfType({1, 2, 3}, integer) --> true 
isListOfType({1, 2, 3, 4.5}, number) --> true 
isListOfType({1, 2, 3, 4.5, "6"}, number) --> false 

Тем не менее, это, как правило, гораздо быстрее и удобнее просто бросить/принуждать значения по мере необходимости в точке они используются, и обрабатывать любые ошибки в это время. например "4" может быть строкой, но вполне приемлемо, когда ожидается целое/реальное, и AppleScript обычно будет принуждать вас к этому, поэтому вам не нужно делать ничего лишнего.

(Оговорка: некоторые AppleScript приведение типов являются потери, например 4.5 as integer раундов даже (4) и {a:1, b:2} as list возвращает значение свойств ({1, 2}), а не список одного вопроса ({{a:1, b:2}}), который не может быть то, что вы хотите. Но, честно говоря, если вам нужен действительно надежный, надежный язык, то вы не должны использовать AppleScript в любом случае)

-.

пс Основы Scripting Essentials помогут вам связать это с мусором и лучше всего избегать. Половина образцов даже не ошибаются, и даже те, которые являются технически правильными, часто бывают хрупкими и медленными. Вам нужны какие-то приличные библиотеки для разметки общего назначения, try these, а затем перейдите на страницу this ticket на bugreport.apple.com, прося Apple принять их для 10.13.

0

Я предлагаю играть с путями ошибок/на ошибках. Я не в моем макинтош атм, но попробуйте это:

property one : 1 
property two : 2 
property three : 3 
property bad : "bad" 

my checkProperty() 

on checkProperty() 
    tell application "Finder" 
     set someList to {one, two, three, bad} 
     repeat with theItem from 1 to length of someList 
      try 
       set item theItem of someList to (item theItem of someList as integer) 
       display dialog theItem 
      on error 
       display dialog "not numerical" 
      end try 
     end repeat 
    end tell 
end checkProperty 

Документация на try/on error.