首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C KVC 自動類型轉換規則完整圖譜

     編輯:關於C語言

核心結論:KVC 接受字符串/數值自動轉換為目標屬性類型

測試類定義:

@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"int2數值字符串 → 數值類型,截斷小數
@"a"int崩潰/異常非數值字符串無法轉換
@"2014 10-24"int2014識別首個數值片段,空格/符號截止
@1 (NSNumber)NSString*@"1"對象 → 字符串調用 description
@1.23float1.23fNSNumber → 基礎數值類型自動解箱
@"99"NSNumber*@"99" (字符串)類→類不轉換,直接賦值 (類型不匹配風險)
@0.9BOOLNO (0)>= 1.0 → YES,< 1.0 → NO
@"1.1"BOOLYES字符串解析為浮點數再判斷
@"TRUE"/@"YES"/@"NO"/@"FALSE"BOOL對應 YES/NO大小寫不敏感識別布爾字面量
@"2014-10-24"NSDate*字符串 (不轉換)類→類不自動解析日期
@"2014-10-24"NSTimeInterval (double)識別失敗字符串不直接轉時間間隔

規律歸納

  1. 標量類型 (int/float/BOOL/雙精度等):字符串/NSNumber → 標量 全自動轉換,邏輯同 NSString 的 intValue/floatValue/boolValue。
  2. 對象類型 (NSString/NSNumber/NSDate/自定義類):**不進行自動轉換**,直接賦值指針。若類型不匹配,運行時崩潰或邏輯錯誤。
  3. BOOL 特殊規則:閾值 1.0,非零即真但字符串解析為浮點後比較。
  4. 容器類型 (NSArray/NSDictionary):**不支持** 字符串直接轉換,需自行解析 JSON/PropertyList。

最佳實踐建議

  • 數據源清洗:網絡/本地配置讀取後,統一在模型層 setValuesForKeysWithDictionary: 前預處理類型 (如日期字符串 → NSDate)。
  • 類型斷言:關鍵屬性在 setValue:forKey: 重寫中加斷言 NSParameterAssert([value isKindOfClass:[NSDate class]]);。
  • 避免 KVC 設對象屬性:除非極其確定類型匹配,否則显式調用 model.date = parsedDate; 更安全、可讀。
  • 單元測試覆蓋:針對各類型邊界值 (空字符串、非數值字符串、極大數、負數) 編寫測試用例。

底層實現提示

KVC 內部調用 NSSetUncaughtExceptionHandler 相關機制,最終由 NSValueTransformer 或各類 *Value 方法實現標量轉換。對象類型直接走 setValue:forKey: 默認實現 (保留/複製語義),無類型檢查。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved