Swift 对象必须是对象类型

Swift object must be of type object

在开始构建我的领域模型时,我的 League class 中只有一个整数引用其运动的 id。然后,为了获得给定运动的所有关联联赛,我在其 Realm 模型中定义了一个反比关系。

这导致一条错误消息指出 dynamic var sport 必须是 Sport 类型,而不是 Int。所以我再次更改它,现在我试图通过传入一个可用于其关系的 Sport 对象来初始化联赛。

现在我又遇到了一个错误,但我什么也找不到。我不太明白错误消息,堆栈跟踪也没有真正帮助我找到更多信息。

class Sport: RLMObject {
  dynamic var id: Int        = 0
  dynamic var sortOrder: Int = 0
  dynamic var name: String   = ""
  dynamic var icon: String   = ""
  var leagues: [League] {
    return linkingObjectsOfClass("League", forProperty: "sport") as! [League]
  }

  override class func primaryKey() -> String {
    return "id"
  }

  init(json: JSON) {
    super.init()
    id        = json["id"].intValue
    name      = json["name"].stringValue
    icon      = json["pictogram"].stringValue
    sortOrder = json["sortOrder"].intValue
  }
}

我的class联赛:

class League: RLMObject {
  dynamic var id: Int               = 0
  dynamic var sport: Sport?         = nil
  // Other properties

  override class func primaryKey() -> String {
    return "id"
  }

  init(json: JSON, sport: Sport) {
    super.init()
    id          = json["id"].intValue
    self.sport  = sport
    // Initializing other properties
  }
}

错误信息:

2015-03-19 16:01:41.393 MSUapp[7012:142456]  Terminating app due to uncaught exception 'Invalid value', reason: 'object must be of type object'
 First throw call stack:
(
    0   CoreFoundation                      0x0075d686 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x0238da97 objc_exception_throw + 44
    2   MSUapp                              0x000e41e0 _ZL15RLMPreconditionbP8NSStringS0_z + 211
    3   MSUapp                              0x000e9cb1 _ZN12_GLOBAL__N_123validate_property_valueEP11RLMPropertyP11objc_objectP8NSString + 485
    4   MSUapp                              0x000e9077 _ZN12_GLOBAL__N_134update_query_with_value_expressionEP9RLMSchemaP15RLMObjectSchemaRN7tightdb5QueryEP8NSStringP11objc_objectP21NSComparisonPredicate + 2691
    5   MSUapp                              0x000e4a18 _ZN12_GLOBAL__N_127update_query_with_predicateEP11NSPredicateP9RLMSchemaP15RLMObjectSchemaRN7tightdb5QueryE + 1713
    6   MSUapp                              0x000e42b2 _Z27RLMUpdateQueryWithPredicatePN7tightdb5QueryEP11NSPredicateP9RLMSchemaP15RLMObjectSchema + 169
    7   MSUapp                              0x000e1e2b RLMGetObjects + 329
    8   MSUapp                              0x000d7d62 +[RLMObject objectsWithPredicate:] + 117
    9   MSUapp                              0x000be58e _TFC6MSUapp24AllLeaguesViewController9tableViewfS0_FTCSo11UITableView21numberOfRowsInSectionSi_Si + 430
    10  MSUapp                              0x000be6fb _TToFC6MSUapp24AllLeaguesViewController9tableViewfS0_FTCSo11UITableView21numberOfRowsInSectionSi_Si + 75
    11  UIKit                               0x0147f21f -[UISectionRowData refreshWithSection:tableView:tableViewRowData:] + 2803
    12  UIKit                               0x014835da -[UITableViewRowData numberOfRows] + 98
    13  UIKit                               0x012a753c -[UITableView noteNumberOfRowsChanged] + 176
    14  UIKit                               0x012a6a41 -[UITableView reloadData] + 1837
    15  MSUapp                              0x000bdb9e _TFC6MSUapp24AllLeaguesViewController24didFinishLoadingJSONDatafS0_FT_T_ + 238
    16  MSUapp                              0x000bf664 _TTWC6MSUapp24AllLeaguesViewControllerS_16JSONDataReceiverS_FS1_24didFinishLoadingJSONDataUS1___fQPS1_FT_T_ + 36
    17  MSUapp                              0x0009490d _TFFC6MSUapp14JSONDataSource18loadRemoteJsonDataFS0_FTSSCS_19GETParameterBuilderFCSo6NSDataT__T_U_FTCSo12NSURLRequestGSqCSo17NSHTTPURLResponse_GSqPSs9AnyObject__GSqCSo7NSError__T_ + 2461
    18  MSUapp                              0x00092d32 _TPA__TFFC6MSUapp14JSONDataSource18loadRemoteJsonDataFS0_FTSSCS_19GETParameterBuilderFCSo6NSDataT__T_U_FTCSo12NSURLRequestGSqCSo17NSHTTPURLResponse_GSqPSs9AnyObject__GSqCSo7NSError__T_ + 162
    19  Alamofire                           0x004a697a _TFFFC9Alamofire7Request8responseFDS0_FT5queueGSqCSo8NSObject_10serializerFTCSo12NSURLRequestGSqCSo17NSHTTPURLResponse_GSqCSo6NSData__TGSqPSs9AnyObject__GSqCSo7NSError__17completionHandlerFTS2_GSqS3__GSqPS5___GSqS6___T__DS0_U_FT_T_U_FT_T_ + 394
    20  Alamofire                           0x004a0d17 _TPA__TFFFC9Alamofire7Request8responseFDS0_FT5queueGSqCSo8NSObject_10serializerFTCSo12NSURLRequestGSqCSo17NSHTTPURLResponse_GSqCSo6NSData__TGSqPSs9AnyObject__GSqCSo7NSError__17completionHandlerFTS2_GSqS3__GSqPS5___GSqS6___T__DS0_U_FT_T_U_FT_T_ + 135
    21  Alamofire                           0x004a4298 _TTRXFo__dT__XFdCb__dT__ + 40
    22  libdispatch.dylib                   0x02a8b5ea _dispatch_call_block_and_release + 15
    23  libdispatch.dylib                   0x02aadbef _dispatch_client_callout + 14
    24  libdispatch.dylib                   0x02a936bb _dispatch_main_queue_callback_4CF + 993
    25  CoreFoundation                      0x006b685e __CFRUNLOOP_IS_SERVICING_THE_MAIN_DISPATCH_QUEUE__ + 14
    26  CoreFoundation                      0x00674680 __CFRunLoopRun + 2256
    27  CoreFoundation                      0x00673aeb CFRunLoopRunSpecific + 443
    28  CoreFoundation                      0x0067391b CFRunLoopRunInMode + 123
    29  GraphicsServices                    0x0526f2c9 GSEventRunModal + 192
    30  GraphicsServices                    0x0526f106 GSEventRun + 104
    31  UIKit                               0x01192366 UIApplicationMain + 1526
    32  MSUapp                              0x000aba94 main + 180
    33  libdyld.dylib                       0x02ad8ac9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

我错过了什么?我没有将运动作为对象传递,而是尝试执行以下操作来设置运动:

   sport = Sport.objectsWhere("id = %i", json["sport"].intValue).firstObject() as Sport

但这产生了完全相同的异常。

解决方案与 完全无关。

TableViewController 中,其中 Sport 是部分,Leagues 是它的单元格,我有以下代码来根据一项运动获得联赛:

var league = League.objectsWhere("sport = %i", sportsList[indexPath.section].id) as League
// sportsList is of type [Sport]

我没想过要把这行也改掉,但是一旦是关系,我不得不改成下面这样:

var league = League.objectsWhere("sport = %@", sportsList[indexPath.section]) as League

这会插入整个对象,而不仅仅是 id。我想我只是太习惯在 Web 开发中使用 MySQL。