2017-02-05 2 views
1

При работе с CloudKit все типы должны быть классами Objective-C. Поскольку большинство типов, используемых в CloudKit, перекрываются от Swift до Obj-C, нет никаких проблем (то есть record[key] = 1 as NSNumber), но мне трудно преобразовать Array<String> в соответствующий тип CloudKit (список строк на панели управления CK). Я полагал, чтоКак лить массив <String> в NSArray, полный NSString

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

будет работать, но не такой удачи. Как я могу преобразовать это?

ответ

1

Просто мост будет работать вместе с array конструктору NSArray «s:

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

Simpler будет 'let nsa = NSArray (array: a.map ({$ 0 as NSString}))' ... – Grimxn

+0

... или даже 'let nsa1 = NSArray (array: a)' ... – Grimxn

0

реальная проблема здесь в том, что индекс сломан, вы можете использовать setObject(forKey:) использовать нативные Swift типов!

редактировать:
Я был неправ, setObject(forKey:) не работает, однако мне удалось получить прошли этот вопрос временно используя setValue(forKey:) вместо этого. Я также продлил CKRecord с subscript, который будет использоваться до тех пор, пока Apple не решит проблему.

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

Это не индекс, но CKRecordValue не принимается родными типами Swift. Как и в случае с индексом, 'setObject (forKey:)' также не работает, не прибегая к быстрым типам к объектам базового типа с Swift 3. – jjatie

+0

вы правы. Я просто посмотрел на свой производственный проект, и я вижу, что вместо этого я использую 'setValue (forKey:)'. Я обновлю свой ответ в качестве альтернативы. – Simon

Смежные вопросы