iOS-__auto_type

類型推斷是一個非常普遍的特性峡扩,在當下的現(xiàn)代語言像Swift, Kotlin 等。幸運的是,類似的效果可以在Xcode 8之后的C或objective - C中通過__auto_type來實現(xiàn)擴展尾菇。

現(xiàn)在我一直在使用在__auto_type基礎(chǔ)之上的宏。

#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()返回的泛型。下面的代碼將發(fā)出一個警告翎卓。

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

如果你不聲明通用具體來說,下面的代碼在編譯時不會發(fā)出警告的泛型類型NSArray不是顯式聲明契邀。

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

內(nèi)聯(lián)block的類型推斷

如果你曾經(jīng)聲明內(nèi)聯(lián)塊你就會知道寫所有的類型簽名多痛苦。當使用__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 的時候會非常習慣坯门。這不是一個大賣點,但這讓開發(fā)人員更容易找到每天多次在不同的語言之間跳躍。

問題:如何推斷nullability類型

在您的代碼中使用__auto_type有一個問題逗扒。目前__auto_type不繼承nullability推斷類型古戴。進一步的信息在:https://openradar.appspot.com/27062504

我認為優(yōu)點大于缺點是事實,你必須明確地寫下每一個變量簽名可以為空,得到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;
  }
}

下面的代碼使用上面的函數(shù)聲明將發(fā)出一個編譯器警告作為一個可以為空指針將被傳遞到一個函數(shù),它接受一個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不會出現(xiàn)像下面的代碼將展示警告述暂。

// 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);

如果你使用靜態(tài)分析器將為你捕獲和顯示一個警告任何情況下。

總結(jié)

我希望我能給你幾個原因為什么我認為__auto_type在代碼中使用是一件好事,但是最后你必須決定如果優(yōu)點多于缺點,你會覺得在你的代碼中使用它非常舒適建炫。

原文--Type Inference with __auto_type

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末畦韭,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子肛跌,更是在濱河造成了極大的恐慌艺配,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衍慎,死亡現(xiàn)場離奇詭異转唉,居然都是意外死亡,警方通過查閱死者的電腦和手機稳捆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進店門赠法,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人乔夯,你說我怎么就攤上這事砖织】钋郑” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵侧纯,是天一觀的道長新锈。 經(jīng)常有香客問我,道長眶熬,這世上最難降的妖魔是什么妹笆? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮娜氏,結(jié)果婚禮上拳缠,老公的妹妹穿的比我還像新娘。我一直安慰自己牍白,他們只是感情好,可當我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布抖棘。 她就那樣靜靜地躺著茂腥,像睡著了一般。 火紅的嫁衣襯著肌膚如雪切省。 梳的紋絲不亂的頭發(fā)上最岗,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音朝捆,去河邊找鬼般渡。 笑死,一個胖子當著我的面吹牛芙盘,可吹牛的內(nèi)容都是我干的驯用。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼儒老,長吁一口氣:“原來是場噩夢啊……” “哼蝴乔!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起驮樊,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤薇正,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后囚衔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挖腰,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年练湿,在試婚紗的時候發(fā)現(xiàn)自己被綠了猴仑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡肥哎,死狀恐怖宁脊,靈堂內(nèi)的尸體忽然破棺而出断国,到底是詐尸還是另有隱情,我是刑警寧澤榆苞,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布稳衬,位于F島的核電站,受9級特大地震影響坐漏,放射性物質(zhì)發(fā)生泄漏薄疚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一赊琳、第九天 我趴在偏房一處隱蔽的房頂上張望街夭。 院中可真熱鬧,春花似錦躏筏、人聲如沸板丽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽埃碱。三九已至,卻和暖如春酥泞,著一層夾襖步出監(jiān)牢的瞬間砚殿,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工芝囤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留似炎,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓悯姊,卻偏偏與公主長得像羡藐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子悯许,可洞房花燭夜當晚...
    茶點故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容

  • 1传睹、通過CocoaPods安裝項目名稱項目信息 AFNetworking網(wǎng)絡(luò)請求組件 FMDB本地數(shù)據(jù)庫組件 SD...
    陽明先生_x閱讀 15,968評論 3 119
  • 山中一摯友,名曰快樂樹岸晦,云深不知處欧啤。 林中鳥語,婉轉(zhuǎn)清脆启上。一道倩影邢隧,曼妙而過……一只輕巧的梅花鹿,飄而駐足冈在,抬頭張...
    游名閱讀 225評論 0 0
  • 胡曉會 河南漯河 焦點網(wǎng)絡(luò)初級九期學員 2018.5.8堅持分享第73天 若焦點集中在問題上倒慧,分兩種情況,...
    胡曉會閱讀 223評論 0 0
  • 這次來IPMT炫贤,選修的是營養(yǎng)學。 如果要統(tǒng)計在Daphne von boch老師的營養(yǎng)學課上被提及頻率最高的詞付秕,“...
    毛茸茸的貓爪閱讀 863評論 0 0
  • 今天中午值班兰珍,張老師是位很認真負責的老師,她提前將五年級孩子帶回班級輔導询吴。感謝她掠河!班級便只剩下我們班的七個孩子...
    凌晨時分的糖豆閱讀 239評論 0 1