// JSON 序列化
- (NSString *)jsonFromObject:(id)obj {
NSError *err;
NSData *data = [NSJSONSerialization dataWithJSONObject:obj options:NSJSONWritingPrettyPrinted error:&err];
return data ? [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding] : nil;
}
// 非空判斷(過濾 null、空串、"(null)"、"")
- (BOOL)isString:(NSString *)str {
return str && ![str isKindOfClass:[NSNull class]] && str.length > 0 && ![str isEqualToString:@"(null)"] && ![str isEqualToString:@""];
}
// 字典安全取值
- (NSString *)valueForKey:(NSString *)key fromDict:(NSDictionary *)dic {
return (dic && [dic.allKeys containsObject:key]) ? dic[key] : @"";
}
// 郵箱/手機/車牌驗證(正則)
- (BOOL)isValidateEmail:(NSString *)email { ... }
- (BOOL)isValidateMobile:(NSString *)mobile { ... }
- (BOOL)validateCarNo:(NSString *)carNo { ... }
// 數字格式化:保留指定小數位
- (NSString *)floatString:(float)val decimals:(int)digits {
return [NSString stringWithFormat:@"%%.%df", digits], val];
}
// 字符串 → Date (格式: yyyy-MM-dd HH:mm:ss)
- (NSDate *)dateFromString:(NSString *)str {
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"yyyy-MM-dd HH:mm:ss";
return [fmt dateFromString:str];
}
// Date → 字符串 (格式: MM-dd HH:mm)
- (NSString *)stringFromDate:(NSDate *)date {
NSDateFormatter *fmt = [[NSDateFormatter alloc] init];
fmt.dateFormat = @"MM-dd HH:mm";
return [fmt stringFromDate:date];
}
// 時間戳 → 相對時間字符串(今天顯示「今天」)
- (NSString *)relativeTimeFromTimestamp:(NSString *)ts {
long long secs = [ts.substringToIndex:10 longLongValue];
NSDate *date = [NSDate dateWithTimeIntervalSince1970:secs];
// ... 比較日期部分,返回「今天」或格式化時間
}
// 根據鍵路徑排序,ascending=YES 升序
- (NSArray *)sortedArray:(NSArray *)array byKey:(NSString *)key ascending:(BOOL)asc {
NSSortDescriptor *sd = [NSSortDescriptor sortDescriptorWithKey:key ascending:asc];
return [array sortedArrayUsingDescriptors:@[sd]];
}
- (NSString *)placeholderIfEmpty:(NSString *)text { return text.length ? text : @"未填寫"; }
- (NSString *)numberWithUnit:(NSNumber *)num unit:(NSString *)unit {
if (!num || num.integerValue == 0) num = @0;
return [NSString stringWithFormat:@"%@%@", [self floatString:num.floatValue decimals:0], unit];
}
NSString+Utils、NSDate+Utils、NSArray+Utils 分類文件中NSPredicate 避免重複創建NSDateFormatter 較重,高頻調用建議緩存或使用單例nullable/nonnull 標註提升 Swift 互調體驗這些分類方法覆蓋了 iOS 日常開發 80% 的字符串、日期、數組處理場景,統一封裝可大幅減少樣板代碼。