2016-08-10 16 views
0

私は、アプリケーション全体で使用するタプルタイプをエイリアスしようとしています。私はこのように最初のエイリアシングを行います:関連付けられたタイプを使用してタプルを作成する

associatedtype JSONReplacementValue = (key: String, value: AnyObject?) 

と思われます。これをassociatedtypeなしで使用すると、すべて正常に動作します。しかし、私はそれらを別名たら、私は次の2つの場所でエラーを取得:

var replacementValues: [JSONReplacementValue] = [] 
if let key = key { 
    replacementValues.append((key: key, value: value)) 
} 

は、これは私にCannot invoke 'append' with an argument list of type '(key: String, value: AnyObject?)に言って、.append行にエラーが発生します。私はJSONReplacementValue(key: key, value: value)のようなものに付けるものを置き換えようとしましたが、それは私にエラーを与えます。'Self.JSONReplacementValue' cannot be constructed because it has no accessible initializers

これは私が回避できない最初のエラーです。第二は、このコードで起こる:Value of type 'Self.JSONReplacementValue' has no member 'key'

for replacementValue in values { 
    json[replacementValue.key] = replacementValue.value 
} 

私はreplacementValue.keyにアクセスしようとすると、これは私にエラーを与える

(値がそうvalues: [JSONReplacementValue]のようなパラメータとして定義されJSONReplacementValueの配列です)。この1つ私はそれを解決する方法を知らない。

タプルをassociatedtypeにすることはできますか?もしそうなら、私はここで間違って何をしていますか?

答えて

0

将来的に見えるものの答えが見つかりました。私はこれをプロトコル定義で宣言しました。これらのメソッドはすべてプロトコル拡張に含まれていました。 typealiasを変更して内線番号に移動すると、すべてが正常に機能しました。

1

タイプアリアスを作成する場合は、typealiasキーワードを試してください。 associatedtypeはプロトコルで動作します。

このコードは2.2迅速に正常に動作します:

typealias JSONReplacementValue = (key: String, value: Any?) 

var replacementValues: [JSONReplacementValue] = [] 
replacementValues.append((key: "one", value: "value")) 
print(replacementValues) // prints: [("one", Optional(value))] 

はまた、すべてのタイプの中AnyAnyObjectは、クラス型のためのものであることを心に留め。

もう1つのことは、タプルの代わりに構造体を使うほうが良いということです。アップルのドキュメントから

タプルは、関連する値の一時的なグループのために便利です。複雑なデータ構造の作成には適していません。データ構造が一時的な範囲を超えて存続する可能性が高い場合は、タプルではなく、クラスまたは構造としてモデル化します。詳細については、「クラスと構造体」を参照してください。

関連する問題