init()
Overview 概要
The NSDictionary
class declares the programmatic interface to objects that manage immutable associations of keys and values. For example, an interactive form could be represented as a dictionary, with the field names as keys, corresponding to user-entered values.
NSDictionary
クラスは、不変のキーと値関係を管理するオブジェクトに対するプログラムインターフェイスを宣言します。例えば、ある相互作用形式は、フィールド名をキーとして持ち、ユーザ入力の値に対応している、ある辞書として表されることができます。
Use this class or its subclass NSMutable
when you need a convenient and efficient way to retrieve data associated with an arbitrary key. NSDictionary
creates static dictionaries, and NSMutable
creates dynamic dictionaries. (For convenience, the term dictionary refers to any instance of one of these classes without specifying its exact class membership.)
このクラスまたはそれのサブクラスNSMutable
を、あなたが随意のキーと結び付けられたデータを回収する便利で効率の良いやり方を必要とする時に使ってください。NSDictionary
は静的な辞書を作成します、そしてNSMutable
は動的な辞書を作成します。(便宜上、この用語、辞書は、これらのクラスの内の1つのどんなインスタンスにでも、それの正確なクラス帰属を明記しないで言及します。
A key-value pair within a dictionary is called an entry. Each entry consists of one object that represents the key and a second object that is that key’s value. Within a dictionary, the keys are unique. That is, no two keys in a single dictionary are equal (as determined by is
). In general, a key can be any object (provided that it conforms to the NSCopying
protocol—see below), but note that when using key-value coding the key must be a string (see Accessing Object Properties). Neither a key nor a value can be nil
; if you need to represent a null value in a dictionary, you should use NSNull
.
辞書の内部のあるキー値ペアは、登録項目(エントリ)と呼ばれます。各登録項目は、キーを表す一方のオブジェクトとそのキーの持つ値である2番目のオブジェクトからなります。ある辞書内では、それらキーは特有です。すなわち、ある単一の辞書の中の2つのキーが等しい(is
によって決定されるように)ことはありません。一般に、キーはどんなオブジェクトであることもできます(それがNSCopying
プロトコルに準拠するという条件で — 下で見てください)、しかしキー値コーディングを使う場合そのキーは文字列でなければならないことに注意してください(Accessing Object Propertiesを見てください)。キーも値もnil
であることはできません;あなたがヌル値を辞書の中で表す必要があるならば、あなたはNSNull
を使うべきです。
NSDictionary
is “toll-free bridged” with its Core Foundation counterpart, CFDictionary
. See Toll-Free Bridging for more information on toll-free bridging.
NSDictionary
は、それのCore Foundation相当物、CFDictionary
と「トールフリーブリッジ」されます。トールフリーブリッジに関する更なる情報としてトールフリーブリッジを見てください。
Creating NSDictionary Objects Using Dictionary Literals NSDictionaryオブジェクトを辞書リテラルを使って作成する
In addition to the provided initializers, such as init(objects:
, you can create an NSDictionary
object using a dictionary literal.
提供されたイニシャライザ、例えばinit(objects:
などに加えて、あなたはNSDictionary
オブジェクトを辞書リテラルを使って作成できます。
In Objective-C, the compiler generates code that makes an underlying call to the init(objects:
method.
Objective-Cでは、コンパイラがinit(objects:
メソッドへの隠れた呼び出しをするコードを生成します。
Unlike dictionary
and other initializers, dictionary literals specify entries in key-value order. You should not terminate the list of objects with nil
when using this literal syntax, and in fact nil
is an invalid value. For more information about object literals in Objective-C, see Working with Objects in Programming with Objective-C.
dictionary
および他のイニシャライザと違い、辞書リテラルはキー値順で登録項目を指定します。あなたは、このリテラル構文を使う時にオブジェクトのリストをnil
で終端すべきではありません、そして実際nil
は無効な値です。Objective-Cにおけるオブジェクトリテラルについてのさらなる情報として、Working with ObjectsをProgramming with Objective-Cで見てください。
In Swift, the NSDictionary
class conforms to the Dictionary
protocol, which allows it to be initialized with dictionary literals. For more information about object literals in Swift, see Literal Expression in The Swift Programming Language (Swift 4.1).
Swiftでは、NSDictionary
クラスはDictionary
プロトコルに準拠します、そのことはそれが辞書リテラルで初期化されることを可能にします。Swiftにおけるオブジェクトリテラルについての更なる情報としてリテラル式をSwiftプログラミング言語(Swift 4.1)で見てください。
Accessing Values Using Subscripting 添え字を使って値にアクセスする
In addition to the provided instance methods, such as object(for
, you can access NSDictionary
values by their keys using subscripting.
提供されたインスタンスメソッド、例えばobject(for
などに加えて、あなたはNSDictionary
値にアクセスすることがそれらのキーによる添え字を使うことで可能です。
Enumerating Entries Using for-in Loops for-inループを使って登録項目を列挙する
In addition to the provided instance methods, such as enumerate
, you can enumerate NSDictionary
entries using for-in loops.
提供されたインスタンスメソッド、例えばenumerate
などに加えて、あなたはNSDictionary
登録項目を列挙することがfor-in loopsを使って可能です。
In Objective-C, NSDictionary
conforms to the NSFast
protocol.
Objective-Cでは、NSDictionary
はNSFast
プロトコルに準拠します。
In Swift, NSDictionary
conforms to the Sequence
protocol.
Swiftでは、NSDictionary
はSequence
プロトコルに準拠します。
Subclassing Notes サブクラス作成の注意
You generally shouldn’t need to subclass NSDictionary
. Custom behavior can usually be achieved through composition rather than subclassing.
あなたは、一般的にNSDictionary
のサブクラス作成を必要としないでしょう。あつらえの挙動は、普通はサプクラスを作成するよりコンポジションを通して達成されます。
Methods to Override メソッドのオーバーライド
If you do need to subclass NSDictionary
, take into account that it is a Class cluster. Any subclass must override the following primitive methods:
あなたがNSDictionary
のサブクラスを作成する必要があるならば、それがClass clusterである可能性を考慮に入れてください。何らかのサブクラスは、以下の根本的メソッドをオーバーライドする必要があります:
The other methods of NSDictionary
operate by invoking one or more of these primitives. The non-primitive methods provide convenient ways of accessing multiple entries at once.
NSDictionary
の他のメソッドは、1つ以上のこれら根本的なものを発動することによって作動します。根本的でないメソッドは、一度に複数の登録項目にアクセスする便利な方法を提供します。
Alternatives to Subclassing サブクラス作成の代わりとなるもの
Before making a custom class of NSDictionary
, investigate NSMap
and the corresponding Core Foundation type, CFDictionary. Because NSDictionary
and CFDictionary
are “toll-free bridged,” you can substitute a CFDictionary
object for a NSDictionary
object in your code (with appropriate casting). Although they are corresponding types, CFDictionary
and NSDictionary
do not have identical interfaces or implementations, and you can sometimes do things with CFDictionary
that you cannot easily do with NSDictionary
.
NSDictionary
のあつらえのクラスを作る前に、NSMap
と対応するCore Foundation型、CFDictionaryを研究してください。NSDictionary
とCFDictionary
は、「toll-freeブリッジ」されるので、あなたは、あなたのコードにおいて(適切なキャストを行うことで)CFDictionary
オブジェクトをNSDictionary
オブジェクトの代わりにすることができます。とは言えそれらが対応している型であっても、CFDictionary
とNSDictionary
は全く同一のインターフェイスや実装を持ちません、そしてあなたは時々CFDictionary
を使って、あなたがNSDictionary
では簡単にはできないような事を行えます。
If the behavior you want to add supplements that of the existing class, you could write a category on NSDictionary
. Keep in mind, however, that this category will be in effect for all instances of NSDictionary
that you use, and this might have unintended consequences. Alternatively, you could use composition to achieve the desired behavior.
あなたが追加したい挙動が既存のクラスのそれを補足するならば、あなたはNSDictionary
上でカテゴリを書くことができます。しかしながら、このカテゴリはあなたが使うNSDictionary
インスタンス全てに対して発効になるのを心してください、そしてこれは意図しない成り行きをもたらすかもしれません。あるいは、あなたは望む挙動を達成するためにコンポジション(合成)を使うことができます。