プロパティリスト
プロパティリストとリストはどちらも値の集合であるため、これらは類似しています。本質的な違いは、リストはシンプルな値の連なりであるのに対し、プロパティリストの各値はキーと呼ばれる名前またはラベルによって特定される点です。プロパティリストの取り扱いに関する詳細情報は、プロパティリスト演算子を参照してください。
例:
put (x:5,y:12) into myPropList //このプロパティリストはそれぞれ、xとyの2つのキーと、5と12の2つの値を含みます。
プロパティリストの作成
プロパティリストを作成するには、そのプロパティごとにキーと値を入力します。各プロパティのキーは、コロンで区切りられるその関連値とコンマで区切られるキー/値のペア、および丸括弧で囲まれたリスト全体に先行します。
例:
put (name:"Elizabeth", age:14) into daughter
空のプロパティリストを指定するには、丸括弧内にコロン(:)を使用するか、empty objectまたはempty property listというフレーズを使用します。
例:
put (:) into newPlist
プロパティリストは(オブジェクトであるため)、テキストファイル内で定義されるオブジェクトのように、その他のオブジェクトからヘルプしてもらうことができます。
例:
put (name:"Hank", age:47) helped by parent,actor into candidate
プロパティリストには、丸括弧の代わりに波括弧{ }を使用することもでき、これにより、行継続文字(「\」)を使用することなく、リストが複数行にまたがることが可能になります。
例:
set detective to {name: "Sherlock Holmes",
address: "221 B Baker Street, London",
remarks: "Enjoys playing violin, solving mysteries"}
プロパティリストが正規リストの最後のアイテムとして発生する場合は、プロパティリストの前後の丸括弧を省略します。本アプローチにより、リスト/プロパティリスト混合の見た目を持つ構文が返されますが、名前付きプロパティが最後に来る必要があります。以下の2行は等価となります。
例:
put (5, 12, (color:"Green", size:42))
put (5, 12, color:"Green", size:42)
重複キーおよびDuplicatePropertyKeyModeグローバルプロパティ
キーがプロパティリスト内で繰り返される場合は、SenseTalkはDuplicatePropertyKeyModeグローバルプロパティを使用して成り行きを制御します。デフォルト設定では、例外が投げられます。ただし、値を変更して最初または最後の値をとるようにするか、すべての値をリストに追加することができます。
このグローバルプロパティに関する詳細情報は、duplicatePropertyKeyModeを参照してください。
プロパティリストのコンテンツ
SenseTalkでは、リストと同じように、プロパティリスト内にリストやその他のプロパティリストなどのあらゆるタイプの値を格納することができます。値の割り当て時には、式を使用できます。
例:
put (label:12592-A, area:pi*r^2, dimensions:(9,8,42), color:(top:"Red", sides:"Black") ) into currentPart
プロパティリストが整列されておらず、logやputコマンドなどによってプロパティリストを表示する場合は、SenseTalkはキーをアルファベット順で表示します。
例:
set Features to (width:9 inches,ports:16,hues:4)
log Features //「(hues:"4", ports:"16", width:"9 inches")」が表示されます
プロパティリスト内のプロパティへのアクセス
プロパティリスト内のプロパティには、複数の方法でアクセスできます。ドット(.)、アポストロフィーS('s)およびof構文の使用により、リクエストしたプロパティへのアクセスまたはオブジェクト上での関数の呼び出しに用いる特別なSenseTalkメカニズムを呼び出すことができます。property ... of構文は、常にプロパティにアクセスします(関数は呼び出しません)。
単純なプロパティリストのプロパティにアクセスする場合は、言及された各構文の効果は同じとなります。つまり、それらは各々特定のプロパティにアクセスします。プロパティ名は大文字と小文字を区別しません。
例:
put (firstName:"Joseph", age:50) into joe
put property age of joe // 50
put the age of joe // 50
put joe's firstName // Joseph
put joe.firstName // Joseph
例:
log evaluateProduct(price:49.99,category:"toys",name:"lego set #12332") //プロパティリストを関数ハンドラ「evaluateProduct」に渡します
function evaluateProduct ProductInfo //関数ハンドラ「evaluateProduct」をパラメータ「ProductInfo」で宣言し、渡されたプロパティリストを受けとります
if ProductInfo.category is "toys" or ProductInfo.category is "books"
if ProductInfo.price is greater than 20 then
return ProductInfo. Name & " is too expensive."
else
return ProductInfo. Name & " has an appropriate price."
end if
else
throw "Unfamiliar product category.", "Category: " & ProductInfo.category
end if
end evaluateProduct
変数の使用によるプロパティリストキーの参照
変数を使用して、プロパティリスト内のプロパティ値にアクセスすることができます。このような形式でプロパティ名として変数(または式)の値を使用するには、変数名を丸括弧で囲む必要があります。変数を丸括弧で囲まない場合は、SenseTalkはアクセスしているプロパティ(または関数)のリテラルな名前としてこれを処理します。
例:
put (firstName:"Joseph", age:50) into joe
set myKey to "firstName"
put joe.(myKey) //「Joseph」が表示されます
未定義プロパティ
strictPropertiesグローバルプロパティがtrueに設定されていない場合は、プロパティリスト内で設定されていないプロパティにアクセスするとemptyが返されます。strictPropertiesがtrueの場合は、事前設定されていないプロパティにアクセスしようとすると例外が投げられます。strictPropertiesのデフォルト値はfalseとなります。
例:
put (name:"Whiskers") into myCat
put the color of myCat //デフォルトで例外が投げられます
リストとして複数プロパティにアクセスする
キーのリストを指定することにより、値のリストとして、複数のプロパティに一度にアクセスできます。
例:
set pitch to (a:440, b:493.88, c:523.25, d:587.33, c:659.26)
put pitch's (e,d,c,d,a) // (659.26,587.33,523.25,587.33,440)
プロパティ値の設定または変更
プロパティリスト内の各プロパティはコンテナであるため、SenseTalkでは、コンテナのコンテンツを変更する任意のコマンド(put、add、sortなど)によりプロパティ値を変更できます。
例:
put (firstname:"Joseph", age:50) into joe
put "ine" after joe's firstName //「Joseph」を「Josephine」に変更します
subtract 7 from the age of joe // joeの年齢値が43という結果が得られます
新しいプロパティの追加
プロパティに何かを格納することで、新しいプロパティをプロパティリストに追加できます。必要に応じて、SenseTalkはネスト化されたプロパティリストを作成します。
例:
put (firstname:"Joseph", age:50) into joe
put "Olivier" into joe.LastName
put "Tabby" into the name of joe's cat // プロパティリストは「(age:"50", cat:(name:"Tabby"), firstname:"Joseph", LastName:"Olivier")」となります
キーのリストを指定することで、複数の新しいプロパティを一度に追加できます。
例:
put (firstname:"Joseph", age:50) into joe
set joe's (height,weight) to ("5ft. 9in.", 143) //プロパティリストは「(age:"50", firstname:"Joseph", height:"5ft. 9in.", weight:"143")」となります
adding properties演算子またはadd propertiesコマンドを使用すると、あるプロパティリストのすべてのプロパティを別のプロパティリストに追加できます。これらの演算は、既存のプロパティの変更は行いません。
例:
set plainCar to (color:"silver",style:"mini van")
put plainCar adding (rims:"spinners",top:"moon roof") into coolCar //プロパティリスト「(color:"silver", rims:"spinners", style:"mini van", top:"moon roof")」を作成します
例:
set smartPerson to (LSAT:170,honors:"summa cum laude")
set newHireRequirements to (barExamStatus:"passed")
add properties of smartPerson to newHireRequirements // プロパティリストは「(barExamStatus:"passed", honors:"summa cum laude", LSAT:"170")」となります
新しい値で既存のプロパティを上書きする場合は、replacing properties演算子またはreplace propertiesコマンドを使用します。
例:
set coolCar to (color:"silver", rims:"spinners", style:"mini van", top:"moon roof")
put coolCar replacing (color:"red") into coolerCar // プロパティリストは「(color:"red", rims:"spinners", style:"mini van", top:"moon roof")」となります
例:
put (phone:"555-555-5555",address:"123 Main St.",name:"Bob Anderson") into clientRecord
replace property (address:"222 Broadway Ave.") in clientRecord //プロパティリストは「(address:"222 Broadway Ave.", name:"Bob Anderson", phone:"555-555-5555")」となります
プロパティの削除
deleteコマンドを使用して削除することで、プロパティリスト内の既存のプロパティを削除できます。
例:
put (school:"West Elementary",hobbies:"fishing") into joe
delete joe.hobbies //プロパティリストは「(school:"West Elementary")」となります
removing properties演算子またはremove propertiesコマンドを利用すると、一度に複数のプロパティを削除できます。
例:
put (barExamStatus:"passed", honors:"summa cum laude", LSAT:"170",internshipStatus:"completed") into newHireRequirements
put (honors:"magna cum laude",barExamStatus:"passed") into Executive
remove properties of Executive from newHireRequirements //プロパティリストは「(internshipStatus:"completed", LSAT:"170")」となります
put newHireRequirements removing property "internshipStatus" //「(LSAT:"170")」が表示されます
ソースプロパティリストに存在しないプロパティを削除しようとしても効果はありません。
retain propertiesコマンドは、保持することが明示的に要求されていないプロパティを削除します。
例:
put (dance:"fox trot",song: "Ain't That a Kick in the Head", partner:"Bob") into DanceProgram
retain properties ("song","dance") of DanceProgram // プロパティリストは「(dance:"fox trot", song:"Ain't That a Kick in the Head")」となります
プロパティリスト内のプロパティのカウント
number関数を使用してキーや値、プロパティの数を数えることにより、プロパティリスト内に存在するプロパティの数を確認することができます。
例:
put the number of keys in (x:5,y:12) -- 2
put the number of values in phoneBook into phoneCount
number of occurrences関数は、特定の値やキーが何回出現するかを数えます。
例:
put the number of occurrences of 5 among the values in (x:5,y:12) -- 1
プロパティ名の表記:Keys関数
keys関数は、プロパティリスト内のプロパティの名前のリストをアルファベット順で提供します。
例:
put (barExamStatus:"passed", honors:"summa cum laude", LSAT:"170",internshipStatus:"completed") into newHireRequirements
put the keys of newHireRequirements // リスト「(barExamStatus,honors,internshipStatus,LSAT)」が表示されます
例:
set mike to (current:("Mike and the Mechanics","Genesis"),previous:"Red 7")
repeat with each item of keys(mike)
put it & ": " & property (it) of mike
end repeat
// 表示
// 現在:(Mike and the Mechanics,Genesis)
// 以前:Red 7
例:
put (testA:"Windows",testB:"Linux") into testSet
repeat with each item test of keys(testSet)
Log "Running"&&test
RunWithNewResults "LoginTestCase", property (test) of testSet
end repeat
プロパティ値の表記:Values関数
values関数を使用すると、プロパティリスト内のすべてのプロパティの値のリストを取得できます。SenseTalkは、各キーの値をアルファベト順で表記します。
例:
set mike to (current:("Mike and the Mechanics","Genesis"),previous:"Red 7")
put the values of mike // ネスト化されたリスト「((Mike and the Mechanics,Genesis),Red 7)」が表示されます
例:
set mike to (current:("Mike and the Mechanics","Genesis"),previous:"Red 7")
repeat with each item of mike's values
if it contains "Genesis" then log "Found it."
end repeat
1つ以上のプロパティ名またはプロパティ名のリストを values関数に渡すと、リクエストしたプロパティ値のみがリクエストした順序どおりに列記されます。
例:
put (color:"blue",tvshow:"X-Files",hobby:"skiing",movie:"Independence Day") into favoriteList
put favoriteList's ("hobby", "color", "movie") //リスト「(skiing,blue,Independence Day)」が表示されます
プロパティリスト内のプロパティの反復処理
repeat with eachループを使用してキーまたは値をステップスルーすることで、プロパティリスト内の各値を用いてアクションを実行できます。特別なit変数を利用すると、現在のキーを参照できます。
例:
set phoneBook to (Mark:"555-1234", John:"555-2345", Eli:"555-3456")
repeat with each of the keys of phoneBook
set value to phoneBook.(it)
put key & ":" && value-- work with
end repeat
また、カスタム変数の名前を使用してキーを参照することもできます。
例:
set myEnvironments to (WindowsVM:("Chrome","Firefox","Internet Explorer"),LinuxVM:("Chrome","Firefox"),MacOSXVM:("Chrome","Safari","Firefox"))
repeat with each SUT of the keys of myEnvironments // キーのアルファベット順に従って、LinuxVMとMacOSXVM、最後にWindowsVMを反復処理します
Connect SUT
put myEnvironments.(SUT) into BrowserList //特定のキーの値(この場合はリスト)を変数に格納します
repeat with each Browser of BrowserList // プロパティリストの値として引き込まれたリスト内の各アイテムを反復処理します
RunWithNewResults "WebTest", Browser
end repeat
end repeat
プロパティリスト内のキーまたは値のチェック
is among演算子を使用すると、プロパティリストに特定のキーまたは値が含まれるかどうかを確認できます。
例:
put "x" is among the keys of (x:5,y:12) // 「true」が表示されます
例:
put 12 is among the values of (x:5,y:12) //「true」が表示されます
例:
put the first item of the folders of "C:\Users\Carrie\Desktop\" into myFolder // デスクトップ上で最初にリスト化されたフォルダを表すオブジェクト(プロパティリスト)を変数に格納します
put "NSFileType" is among the keys of myFolder // 「true」が表示されます
状況に応じて、containsまたはis in演算子を使用する場合もあります。プロパティリストを利用して作業する場合は、オブジェクトそのものによってこれらの演算子の意味を定義できます。または、objectContainsItemDefinitionグローバルプロパティを設定してこれらの演算子を構成することも可能です。ただし、プロパティリストを備えたcontainsまたはis in演算子の挙動は、デフォルトでは、プロパティリストのテキスト値の従属文字列のチェックとなります。
例:
set PersonalInfo to (asText:"Robert",age:31,hair:"brown",height:"5 feet 11 inches",degrees:("BS","MS"))
put "hair" is among the keys of PersonalInfo // 「true」が返されます
put PersonalInfo contains "hair" // プロパティリストのテキスト値が「Robert」であるため、「false」が返されます
set the objectContainsItemDefinition to KeyorValueEquals
put "hair" is in PersonalInfo // hairがプロパティリストのキーであるため、「true」が返されます
put "BS" is in PersonalInfo //「BS」がプロパティリストのキーでも値でもないため、「false」が返されます
set the objectContainsItemDefinition to NestedValueContains
put PersonalInfo contains "BS" // 「BS」がプロパティリスト内でネスト化された値のため、「true」が返されます
プロパティリストのテキストへの変換
プロパティリストにテキストとしてアクセスする場合(putコマンドで表示する場合など)は、SenseTalkがプロパティリストをテキスト表現に変換します。プロパティリストがテキストに変換される場合は、SenseTalkはリスト内の各値をテキスト表現に変換します。本件に関する詳細情報は、値の変換を参照してください。
プロパティリストにasTextプロパティが含まれる場合は、SenseTalkはオブジェクトのテキスト表現として、そのプロパティの値を使用します。
例:
set Color to (asText:"Pink","Candy Floss":424,"Warley Rose":874,"Alyssum Wonder":737)
log Color // 「Pink」が表示されます
プロパティリストにasTextプロパティは含まれないが、asTextFormatプロパティは含まれる場合は、SenseTalkはその値を統合フォーマットとして使用してテキスト表現を生成させます。統合フォーマットに関する情報は、merge関数を参照してください。asTextやasTextFormatプロパティなどのスペシャルプロパティに関する情報は、スペシャルプロパティまたはテキストとしてオブジェクトを表示を参照してください。
例:
set SoupdeJour to (temperature:"cold",base:"tomato",asTextFormat:"Today's soup is a [[my temperature]] soup with a [[my base]] base.")
Log SoupdeJour // 「Today's soup is a cold soup with a tomato base」が表示されます
asTextプロパティもasTextFormatプロパティも存在しない場合は、SenseTalkはデフォルトでpropertyListFormatグローバルプロパティの値を使用し、テキスト表現を作成します。詳細情報は、テキストとしてオブジェクトを表示およびオブジェクトプロパティを参照してください。本テキストは、propertyListFormatのプレフィックスおよびサフィックスプロパティの値によって囲まれます(デフォルトでは開き丸括弧と閉じ丸括弧)。プロパティは、keySeparator(デフォルトではコロン)によって値から切り離されたキーと、entrySeparator(コンマ)によってお互い区切られたキー/値のペアを用いて表記されます。値は引用符で囲まれます。空のプロパティリストのデフォルトのテキスト表現は、emptyRepresentationプロパティ(デフォルトでは「(:)」)で表されます。デフォルトフォーマットは、propertyListFormatグローバルプロパティの値を設定して変更できます。これらの値は、emptyを含め、希望するあらゆるテキストに設定できます。
例:
set the propertyListFormat to (prefix:empty,suffix:empty,keySeparator:"#",entrySeparator:",")
set beverages to (water:"cold",tea:"hot")
log beverages // 「tea#hot,water#cold」が表示されます
例:
set the propertyListFormat to (prefix:"The value of", keySeparator:"is", entryseparator: "and the value of", suffix:".",emptyRepresentation:"the value is empty.")
put (x:12,y:13) // 「The value of x is "12" and the value of y is "13"」が表示されます
プロパティリストのすべてのキーと値のテキスト表現を取得するには、standardFormat関数を使用して、ファイル内に格納するのに適したプロパティリストの標準的表現を生成させます。本テキストは、そのテキストがvalue関数で評価される場合は、再度元のプロパティリストを生成するフォーマットで表されます(値の変換を参照)。
例:
put "C:\Users\Carrie\Desktop\Color.txt" into ColorsFile
put standardformat("Candy Floss":424,"Warley Rose":874,"Alyssum Wonder":737) into file ColorsFile
put value(file ColorsFile) into tempData
log tempData's "Warley Rose" // 「874」が表示されます
テキストのプロパティリストへの変換
splitおよびjoinコマンドと関数、asText関数(詳細はテキストの取り扱いを参照)、そして対応するsplit byおよびjoined by演算子(式を参照)を使用して、テキストからプロパティリストへ、プロパティリストからテキストへの変換を明示的に行うことができます。
例:
put line 1 of file resourcePath("locations.txt") into Locations // Locations.txtは、「Colorado:Fort Collins,Michigan:Lansing,Oregon:Bend」のようにフォーマットされたline 1の文字列(だがプロパティリストではない)を変数のLocationsに格納します
split Locations using "," and ":" // 文字列内のコンマとセミコロンの位置に基づき、Locations内の文字列をtrueプロパティリストに変換します
repeat with each of the keys of Locations // これでプロパティリストに変換されたため、Locationsのキー(Colorado、Michigan、Oregon)を反復処理することができます
If it is "Oregon" then TypeText Locations.(it) // SUTに「Bend」と記入します
end repeat
value関数を使用すると、standardFormat関数の後に続く文字列を変換して元のプロパティリストに戻すことができます。本アプローチは、外部のデータファイルを使用してプロパティリスト情報を格納する場合に役立ちます。
例:
repeat with each line Salary of file resourcePath("SalaryList.txt") // データファイルからの入力は常に文字列となります。この場合、この文字列はstandardFormat 「{Bob:@"$100,000.00"}」に格納されます
put value(Salary) into CurrentSalary // standardFormatに従って文字列を評価し、自動的にプロパティリストに変換します
put the keys of CurrentSalary // trueのプロパティリストがCurrentSalaryに格納されるため、そのキーにアクセスすることができます
end repeat
asObject関数(as a property listやas an object演算子から呼び出されることが多い)は、standardFormat内の文字列を最も単純なオブジェクトであるプロパティリストに変換するための代替メソッドです。
例:put line 1 of file resourcePath("SalaryList.txt") as a property list into Salary // データファイルは、standardFormatのプロパティリスト「{Bob:@"$100,000.00"}」を格納します
Log "The salary is "&Salary.bob&"." // 「The salary is $100,000.00.」をログに記録します
オブジェクトとメッセージ
これまで説明してきた要点により、スクリプトの記述や多くのタスクの達成に十分な理解が得られたことと思います。SenseTalkを十分に理解し、その機能を活用するために把握すべきあといくつかのコンセプトが存在します。すなわち、メッセージとハンドラ、およびオブジェクトとヘルパーです。
オブジェクトとメッセージ――オブジェクトの力強いコンセプトを紹介し、オブジェクトの作成方法、各プロパティへのアクセス方法、およびオブジェクトへのメッセージの送信方法を説明します。オブジェクトにその他のオブジェクトを「ヘルプ」させることのできるオブジェクトヘルパーについても説明します。
メッセージの操作――メッセージの送信と処理を行うコマンドと構成について説明します。