// 类型编码
// @encode
/*
char *typeChar1 = @encode(int32_t);
char *typeChar2 = @encode(NSArray);
NSLog(@"%s, %s", typeChar1, typeChar2);
// i, {NSArray=#}
*/
// 这个类型编码 @encode 最常用的地方是在传递参数时,由于类型确实,需要类型编码进行辅助以保证类型信息也能够被传递
// NSValue 的属性 .objCType 获取类型指针
let int: Int = 0
let float: Float = 0.0
let double: Double = 0.0
let initNumber: NSNumber = int as NSNumber
let floatNumber: NSNumber = float as NSNumber
let doubleNumber: NSNumber = double as NSNumber
let str1 = String(validatingUTF8: initNumber.objCType) // q
let str2 = String(validatingUTF8: floatNumber.objCType) // f
let str3 = String(validatingUTF8: doubleNumber.objCType) // d
let p = NSValue(cgPoint: CGPoint(x: 3, y: 3))
let pStr = String(validatingUTF8: p.objCType) // {CGPoint=dd}
let t = NSValue(cgAffineTransform:.identity)
let tStr = String(validatingUTF8: t.objCType)// {CGAffineTransform=dddddd}
// 有了这些细心,我们就能够在这类信息可能损害的时候构建起准确的类型转换和还原
// 比如,想要在 NSUserDefaults中存储一些不同类型的数字,然后读取的时候再准确的还原为之前的类型,就可以使用类簇来获取这些数字转化为 NSNumber 后真真的类型,然后存储。 使用 objcType 获取类型,然后将数字本身和类型的字符串一起存储。在读取的时 就可以通过匹配类型字符串和类型的编码,确定数字本来所属的类型,从而直接得到想 Int 或者 Double这样的类型明确的量
网友评论