測試類定義:
@interface Entity : NSObject @property (copy) NSString *str; @property (assign) int i1, i2, i3; @property (assign) float f1; @property (strong) NSNumber *num; @property (assign) BOOL b1, b2, b3; @property (strong) NSDate *date1; @property (assign) NSTimeInterval t1; @end
| 輸入值 | 目標類型 | 結果 | 規則說明 |
|---|---|---|---|
@"2.4" | int | 2 | 數值字符串 → 數值類型,截斷小數 |
@"a" | int | 崩潰/異常 | 非數值字符串無法轉換 |
@"2014 10-24" | int | 2014 | 識別首個數值片段,空格/符號截止 |
@1 (NSNumber) | NSString* | @"1" | 對象 → 字符串調用 description |
@1.23 | float | 1.23f | NSNumber → 基礎數值類型自動解箱 |
@"99" | NSNumber* | @"99" (字符串) | 類→類不轉換,直接賦值 (類型不匹配風險) |
@0.9 | BOOL | NO (0) | >= 1.0 → YES,< 1.0 → NO |
@"1.1" | BOOL | YES | 字符串解析為浮點數再判斷 |
@"TRUE"/@"YES"/@"NO"/@"FALSE" | BOOL | 對應 YES/NO | 大小寫不敏感識別布爾字面量 |
@"2014-10-24" | NSDate* | 字符串 (不轉換) | 類→類不自動解析日期 |
@"2014-10-24" | NSTimeInterval (double) | 識別失敗 | 字符串不直接轉時間間隔 |
NSString 的 intValue/floatValue/boolValue。setValuesForKeysWithDictionary: 前預處理類型 (如日期字符串 → NSDate)。setValue:forKey: 重寫中加斷言 NSParameterAssert([value isKindOfClass:[NSDate class]]);。model.date = parsedDate; 更安全、可讀。 KVC 內部調用 NSSetUncaughtExceptionHandler 相關機制,最終由 NSValueTransformer 或各類 *Value 方法實現標量轉換。對象類型直接走 setValue:forKey: 默認實現 (保留/複製語義),無類型檢查。