This question asks whether one can use subscripting with CKRecord in Swift. While I already knew how to do what the questioner wanted, every permutation of it g
I was able to successfully subscript by piggy-backing off of some code written by an Apple engineer on dev forums.
import CloudKit
protocol MyCKRecordValueType {
var asObject: CKRecordValue { get }
}
extension CKRecord {
func set(value: ValueType, forKey key: String) where ValueType : MyCKRecordValueType {
let object = value.asObject
self.setObject(object, forKey: key)
}
subscript(key : String) -> MyCKRecordValueType? {
set {
self.setObject(newValue?.asObject, forKey: key)
}
get {
return object(forKey: key) as? MyCKRecordValueType
}
}
}
extension String : MyCKRecordValueType {
var asObject: CKRecordValue { return self as NSString }
}
extension Bool : MyCKRecordValueType {
var asObject: CKRecordValue { return self as NSNumber }
}
extension Int : MyCKRecordValueType {
var asObject: CKRecordValue { return self as NSNumber }
}
extension Data : MyCKRecordValueType {
var asObject: CKRecordValue { return self as NSData }
}
you can then call the subscript as you would expect:
let firstRecordID = CKRecordID(recordName: "0")
let record = CKRecord(recordType: "Foo", recordID: firstRecordID)
record["title"] = "Hello World"
record["year_established"] = 2000