iOS-__auto_type

类型推断是一个非常普遍的特性,在当下的现代语言像Swift, Kotlin 等。幸运的是,类似的效果可以在Xcode 8之后的C或objective - C中通过__auto_type来实现扩展。

现在我一直在使用在__auto_type基础之上的宏。

#define let __auto_type const
#define var __auto_type

长类型的signatures

类型签名可以变得非常长。

NSDictionary<NSString *, NSDictionary<NSIndexPath *, ASCollectionElement *> *> *supplementElementDict = [elementMap supplementaryElements];

每次你想声明一个supplementaryElements这段长的返回值。__auto_type这将变得更短,它仍然能够知道supplementElementDict是什么。

let supplementElementDict = [elementMap supplementaryElements];

let常量

Swift的一个好处是让最常用和方便的方式声明变量不变。与此同时const也存在于C和objective - C,但几乎没有人真正使用它:

NSString *const name = @"Michael";

用__auto_type可让代码可读性更高:

let name = @"Michael";

泛型类型的“光”???

通常使用一个方法返回对象是否支持泛型像NSArray或NSDictionary你必须显式地声明返回类型。让我们举个例子使用这段代码:

// Takes in an NSArray<NSString *> *
static void processSomePeople(NSArray<NSString *> *peoples) {
  NSCParameterAssert([peoples isKindOfClass:[NSArray class]]);
for (NSString *people in peoples) {
    NSCAssert([people isKindOfClass:[NSString class]], @"Should be a NSString");
    // Do some more with people
  }
}
// Returns NSArray<NSNumber *> *
static NSArray<NSNumber *> *somePeopleNumbers() {
  return @[@1, @2, @3];
}

__auto_type会自动推断从somePeopleNumbers()返回的泛型。下面的代码将发出一个警告。

let people = somePeopleNumbers(); // Returns a NSArray<NSNumber *> *
processSomePeople(people);        // Takes a NSArray<NSString *> *

如果你不声明通用具体来说,下面的代码在编译时不会发出警告的泛型类型NSArray不是显式声明。

NSArray *people = somePeopleNumbers(); // Return type is NSArray<NSNumber *>
processSomePeople(people);         // Will take in a NSArray<NSString *>

内联block的类型推断

如果你曾经声明内联块你就会知道写所有的类型签名多痛苦。当使用__auto_type块类型将自动推断和看起来更熟悉分配一个变量在其他类型。

// Block variable signature
void (^block)(id, NSUInteger, BOOL *) = ^(id obj, NSUInteger idx, BOOL *stop) {
  // Do something
};
[array enumerateObjectsUsingBlock:block];
// Inferred block
let block = ^(id obj, NSUInteger idx, BOOL *stop) {
  // Do something
};
[array enumerateObjectsUsingBlock:block];

和Swift类似

熟悉Swift的let 和 var 或者 C++的 auto / const auto在使用let 和 var 的时候会非常习惯。这不是一个大卖点,但这让开发人员更容易找到每天多次在不同的语言之间跳跃。

问题:如何推断nullability类型

在您的代码中使用__auto_type有一个问题。目前__auto_type不继承nullability推断类型。进一步的信息在:https://openradar.appspot.com/27062504

我认为优点大于缺点是事实,你必须明确地写下每一个变量签名可以为空,得到nullability类型的编译器的警告。例如我们来看下面的代码。

// Takes in a nonnull NSString
static void removeUserFromCacheWithId:(NSString * _Nonnull greeting) {
  // Try to remove the user from the cache
}
// Returns either a NSString or nil
static NSString * _Nullable currentUserId() {
  if (arc4random() % 2 == 0) {
    return @"100";
  } else {
    return nil;
  }
}

下面的代码使用上面的函数声明将发出一个编译器警告作为一个可以为空指针将被传递到一个函数,它接受一个null指针。

// This will emit a warning while compiling
removeUserFromCacheWithId(currentUserId());
// This will emit a warning while compiling too
NSString *_Nullable userId = currentUserId();
removeUserFromCacheWithId(userId);

正如你所看到的在上面的示例中,得到一个编译器警告你必须显式地声明返回类型的指针currentUserId nullable()。如果你不声明它可以为空或使用__auto_type不会出现像下面的代码将展示警告。

// All of them are NOT emitting a warning while compiling
// BUT - The latest Clang static analyzer emits:
// Warning: Nullable pointer is passed to a callee that
//          requires a non-null argument for both cases
NSString *userId = currentUserId();
// or
let userId = currentUserId();
removeUserFromCacheWithId(userId);

如果你使用静态分析器将为你捕获和显示一个警告任何情况下。

总结

我希望我能给你几个原因为什么我认为__auto_type在代码中使用是一件好事,但是最后你必须决定如果优点多于缺点,你会觉得在你的代码中使用它非常舒适。

原文--Type Inference with __auto_type

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,423评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,339评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,241评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,503评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,824评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,262评论 1 207
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,615评论 2 309
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,337评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 33,989评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,300评论 2 240
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,829评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,193评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,753评论 3 230
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,970评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,708评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,295评论 2 267
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,207评论 2 258

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,934评论 3 118
  • 山中一挚友,名曰快乐树,云深不知处。 林中鸟语,婉转清脆。一道倩影,曼妙而过……一只轻巧的梅花鹿,飘而驻足,抬头张...
    游名阅读 206评论 0 0
  • 胡晓会 河南漯河 焦点网络初级九期学员 2018.5.8坚持分享第73天 若焦点集中在问题上,分两种情况,...
    胡晓会阅读 213评论 0 0
  • 这次来IPMT,选修的是营养学。 如果要统计在Daphne von boch老师的营养学课上被提及频率最高的词,“...
    毛茸茸的猫爪阅读 820评论 0 0
  • 今天中午值班,张老师是位很认真负责的老师,她提前将五年级孩子带回班级辅导。感谢她!班级便只剩下我们班的七个孩子...
    凌晨时分的糖豆阅读 219评论 0 1