2017-02-05 11 views
1

CloudKitで作業するには、すべてのタイプがObjective-C基礎クラスである必要があります。 CloudKitで使用されるほとんどのタイプはSwiftからObj-Cにブリッジされるため、問題はありません(record[key] = 1 as NSNumber)が、Array<String>を適切なCloudKitタイプ(CKダッシュボードの文字列リスト)に変換する際に問題があります。私はキャストする方法<String>をNSArrayにNSStringの完全なNSString

record[key] = ([myString] as [NSString]) as NSArray

動作しますが、そのような運を考え出し。どのように私はこれを変換できますか?

答えて

1

が一緒にNSArrayarrayコンストラクタで、動作します:

let a = ["a", "bc", "def"] 
let nsa = NSArray(array: a) 
nsa[0] is NSString // *** true *** 
0
var str = "Hello, playground" 

var arrayString:[String] = [str] 

var arrayNSString = NSMutableArray() 

for p in 0..<arrayString.count 
{ 
    arrayNSString.add(arrayString[p] as NSString) 
} 

希望します。ただ、ブリッジ

+0

新しいものに配列をマッピングすることは、ブリッジされると思われる種類のオーバーヘッドのように思えます。 – jjatie

+0

シンプルなのは 'let nsa = NSArray(配列:a.map($ NS as NSString))' ... – Grimxn

+0

...または 'let nsa1 = NSArray(array:a)' ... – Grimxn

0

をここでの本当の問題は、ネイティブ・スウィフトのタイプを使用するようsetObject(forKey:)を使用することができ、添字が壊れているということです!

編集:
私はsetObject(forKey:)が動作しない、間違っていたが、しかし、私の代わりにsetValue(forKey:)を使用することにより、一時的にこの問題を渡されることができました。 Appleが問題を解決するまで、CKRecordsubscriptに拡張しました。

extension CKRecord { 
    @nonobjc 
    subscript(key: String) -> Any? { 
     set { 
      setValue(newValue, forKey: key) 
     } 
     get { 
      return value(forKey: key) 
     } 
    } 
} 
+1

これは下付き文字ではありませんが、CKRecordValueはSwiftネイティブタイプでは採用されていません。下付き文字と同様に、 'setObject(forKey:)'もSwift 3のようなobj-c基底型にswift型を強制しないと動作しません。 – jjatie

+0

あなたは正しいです。私は私のプロダクションプロジェクトを見て、代わりに 'setValue(forKey:)'を使っているのが分かります。私は代わりに私の答えを更新します。 – Simon

関連する問題