iOS 面試題

設(shè)計(jì)模式是什么莱睁? 你知道哪些設(shè)計(jì)模式待讳,并簡(jiǎn)要敘述?

設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn)仰剿,就是用比較成熟的邏輯去處理某一種類(lèi)型的事情创淡。

  • MVC模式:Model View Control,把模型 視圖 控制器 層進(jìn)行解耦合編寫(xiě)南吮。
  • MVVM模式:Model View ViewModel 把模型 視圖 業(yè)務(wù)邏輯 層進(jìn)行解耦和編寫(xiě)琳彩。
  • 單例模式:通過(guò)static關(guān)鍵詞,聲明全局變量部凑。在整個(gè)進(jìn)程運(yùn)行期間只會(huì)被賦值一次露乏。
  • 觀察者模式:KVO是典型的通知模式,觀察某個(gè)屬性的狀態(tài)涂邀,狀態(tài)發(fā)生變化時(shí)通知觀察者瘟仿。
  • 委托模式:代理+協(xié)議的組合。實(shí)現(xiàn)1對(duì)1的反向傳值操作比勉。
  • 工廠模式:通過(guò)一個(gè)類(lèi)方法劳较,批量的根據(jù)已有模板生產(chǎn)對(duì)象。

MVC 和 MVVM 的區(qū)別

  • MVVM是對(duì)胖模型進(jìn)行的拆分浩聋,其本質(zhì)是給控制器減負(fù)兴想,將一些弱業(yè)務(wù)邏輯放到VM中去處理。
  • MVC是一切設(shè)計(jì)的基礎(chǔ)赡勘,所有新的設(shè)計(jì)模式都是基于MVC進(jìn)行的改進(jìn)。

frame 和 bounds 有什么不同捞镰?

frame指的是:該view在父view坐標(biāo)系統(tǒng)中的位置和大小闸与。(參照點(diǎn)是父view的坐標(biāo)系統(tǒng))
bounds指的是:該view在本身坐標(biāo)系統(tǒng)中的位置和大小。(參照點(diǎn)是本身坐標(biāo)系統(tǒng))

Objective-C 中創(chuàng)建線程的方法是什么岸售?如果在主線程中執(zhí)行代碼践樱,方法是什么?如果想延時(shí)執(zhí)行代碼凸丸、方法又是什么拷邢?

線程創(chuàng)建有三種方法:

  • 使用NSThread創(chuàng)建
  • 使用GCD的dispatch
  • 使用子類(lèi)化的NSOperation,然后將其加入NSOperationQueue;在主線程執(zhí)行代碼,方法是performSelectorOnMainThread屎慢,如果想延時(shí)執(zhí)行代碼可以performSelector:onThread:withObject:waitUntilDone:

Category(類(lèi)別)瞭稼、 Extension(擴(kuò)展)和繼承的區(qū)別

區(qū)別:

  • 分類(lèi)有名字,類(lèi)擴(kuò)展沒(méi)有分類(lèi)名字腻惠,是一種特殊的分類(lèi)环肘。
  • 分類(lèi)只能擴(kuò)展方法(屬性僅僅是聲明,并沒(méi)真正實(shí)現(xiàn))集灌,類(lèi)擴(kuò)展可以擴(kuò)展屬性悔雹、成員變量和方法。
  • 繼承可以增加,修改或者刪除方法腌零,并且可以增加屬性梯找。

如何對(duì)iOS設(shè)備進(jìn)行性能測(cè)試?

  • Profile-> Instruments ->Time Profiler

開(kāi)發(fā)項(xiàng)目時(shí)你是怎么檢查內(nèi)存泄露益涧?

  • 靜態(tài)分析 analyze锈锤。
  • instruments工具里面有個(gè)leak可以動(dòng)態(tài)分析。

什么是block饰躲?

閉包(block):閉包就是獲取其它函數(shù)局部變量的匿名函數(shù)牙咏。

  • block反向傳值
  • 在控制器間傳值可以使用代理或者block,使用block相對(duì)來(lái)說(shuō)簡(jiǎn)潔嘹裂。

block的注意點(diǎn)

  • 在block內(nèi)部使用外部指針且會(huì)造成循環(huán)引用情況下妄壶,需要用__week修飾外部指針: __weak typeof(self) weakSelf = self;
  • 在block內(nèi)部如果調(diào)用了延時(shí)函數(shù)還使用弱指針會(huì)取不到該指針,因?yàn)橐呀?jīng)被銷(xiāo)毀了寄狼,需要在block內(nèi)部再將弱指針重新強(qiáng)引用一下丁寄。 __strong typeof(self) strongSelf = weakSelf;
  • 如果需要在block內(nèi)部改變外部棧區(qū)變量的話,需要在用__block修飾外部變量泊愧。

你一般是怎么用Instruments的伊磺?

  • Time Profiler: 性能分析
  • Zombies:檢查是否訪問(wèn)了僵尸對(duì)象,但是這個(gè)工具只能從上往下檢查删咱,不智能屑埋。
  • Allocations:用來(lái)檢查內(nèi)存,寫(xiě)算法的那批人也用這個(gè)來(lái)檢查痰滋。
  • Leaks:檢查內(nèi)存摘能,看是否有內(nèi)存泄露。

iOS中常用的數(shù)據(jù)存儲(chǔ)方式有哪些敲街?

數(shù)據(jù)存儲(chǔ)有四種方案:NSUserDefault团搞、KeyChain、file多艇、DB逻恐。
其中File有三種方式:plist、Archive(歸檔)
DB包括:SQLite峻黍、FMDB复隆、CoreData

GCD 與 NSOperation 的區(qū)別:

GCD 和 NSOperation 都是用于實(shí)現(xiàn)多線程
GCD 基于C語(yǔ)言的底層API,GCD主要與block結(jié)合使用奸披,代碼簡(jiǎn)潔高效昏名。
NSOperation 屬于Objective-C類(lèi),是基于GCD更高一層的封裝阵面。復(fù)雜任務(wù)一般用NSOperation實(shí)現(xiàn)轻局。

寫(xiě)出使用GCD方式從子線程回到主線程的方法代碼

dispatch_sync(dispatch_get_main_queue(), ^{ });

如何用GCD同步若干個(gè)異步調(diào)用洪鸭?(如根據(jù)若干個(gè)url異步加載多張圖片,然后在都下載完成后合成一張整圖)

// 使用Dispatch Group追加block到Global Group Queue,這些block如果全部執(zhí)行完畢仑扑,就會(huì)執(zhí)行Main Dispatch Queue中的結(jié)束處理的block览爵。
 // 創(chuàng)建隊(duì)列組 dispatch_group_t group = dispatch_group_create();
 // 獲取全局并發(fā)隊(duì)列 
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); 
dispatch_group_async(group, queue, ^{ /*加載圖片1 */ }); 
dispatch_group_async(group, queue, ^{ /*加載圖片2 */ }); 
dispatch_group_async(group, queue, ^{ /*加載圖片3 */ });
// 當(dāng)并發(fā)隊(duì)列組中的任務(wù)執(zhí)行完畢后才會(huì)執(zhí)行這里的代碼
dispatch_group_notify(group, dispatch_get_main_queue(), ^{         // 合并圖片 });

什么是 RunLoop

從字面上講就是運(yùn)行循環(huán),它內(nèi)部就是do-while循環(huán)镇饮,在這個(gè)循環(huán)內(nèi)部不斷地處理各種任務(wù)蜓竹。
一個(gè)線程對(duì)應(yīng)一個(gè)RunLoop,基本作用就是保持程序的持續(xù)運(yùn)行储藐,處理app中的各種事件俱济。通過(guò)runloop,有事運(yùn)行钙勃,沒(méi)事就休息蛛碌,可以節(jié)省cpu資源,提高程序性能辖源。

什么是 Runtime

Runtime又叫運(yùn)行時(shí)蔚携,是一套底層的C語(yǔ)言API,其為iOS內(nèi)部的核心之一克饶,我們平時(shí)編寫(xiě)的OC代碼酝蜒,底層都是基于它來(lái)實(shí)現(xiàn)的。

Runtime實(shí)現(xiàn)的機(jī)制是什么矾湃,怎么用亡脑,一般用于干嘛?

  • 使用時(shí)需要導(dǎo)入的頭文件 <objc/message.h> <objc/runtime.h>
  • Runtime 運(yùn)行時(shí)機(jī)制邀跃,它是一套C語(yǔ)言庫(kù)远豺。
  • 實(shí)際上我們編寫(xiě)的所有OC代碼,最終都是轉(zhuǎn)成了runtime庫(kù)的東西坞嘀。
    比如:

類(lèi)轉(zhuǎn)成了 Runtime 庫(kù)里面的結(jié)構(gòu)體等數(shù)據(jù)類(lèi)型
方法轉(zhuǎn)成了 Runtime 庫(kù)里面的C語(yǔ)言函數(shù)
平時(shí)調(diào)方法都是轉(zhuǎn)成了 objc_msgSend 函數(shù)(所以說(shuō)OC有個(gè)消息發(fā)送機(jī)制)
OC是動(dòng)態(tài)語(yǔ)言,每個(gè)方法在運(yùn)行時(shí)會(huì)被動(dòng)態(tài)轉(zhuǎn)為消息發(fā)送惊来,即:objc_msgSend(receiver, selector)丽涩。
[stu show]; 在objc動(dòng)態(tài)編譯時(shí),會(huì)被轉(zhuǎn)意為:objc_msgSend(stu, @selector(show));

  • 因此裁蚁,可以說(shuō) Runtime 是OC的底層實(shí)現(xiàn)矢渊,是OC的幕后執(zhí)行者。

有了Runtime庫(kù)枉证,能做什么事情呢矮男?

Runtime庫(kù)里面包含了跟類(lèi)、成員變量室谚、方法相關(guān)的API毡鉴。
比如:

  • 獲取類(lèi)里面的所有成員變量崔泵。
  • 為類(lèi)動(dòng)態(tài)添加成員變量。
  • 動(dòng)態(tài)改變類(lèi)的方法實(shí)現(xiàn)猪瞬。
  • 為類(lèi)動(dòng)態(tài)添加新的方法等憎瘸。

因此,有了Runtime陈瘦,想怎么改就怎么改幌甘。

什么是 TCP / UDP ?

  • TCP:傳輸控制協(xié)議。
    TCP 是面向連接的痊项,建立連接需要經(jīng)歷三次握手锅风,是可靠的傳輸層協(xié)議。
  • UDP:用戶數(shù)據(jù)協(xié)議鞍泉。
    UDP 是面向無(wú)連接的皱埠,數(shù)據(jù)傳輸是不可靠的,它只管發(fā)塞弊,不管收不收得到漱逸。 簡(jiǎn)單的說(shuō),TCP注重?cái)?shù)據(jù)安全游沿,而UDP數(shù)據(jù)傳輸快點(diǎn)饰抒,但安全性一般。

tableView的重用機(jī)制诀黍?

UITableView 通過(guò)重用單元格來(lái)達(dá)到節(jié)省內(nèi)存的目的: 通過(guò)為每個(gè)單元格指定一個(gè)重用標(biāo)識(shí)符袋坑,即指定了單元格的種類(lèi),當(dāng)屏幕上的單元格滑出屏幕時(shí),系統(tǒng)會(huì)把這個(gè)單元格添加到重用隊(duì)列中眯勾,等待被重用枣宫,當(dāng)有新單元格從屏幕外滑入屏幕內(nèi)時(shí),從重用隊(duì)列中找看有沒(méi)有可以重用的單元格吃环,如果有也颤,就拿過(guò)來(lái)用,如果沒(méi)有就創(chuàng)建一個(gè)來(lái)使用郁轻。

你是怎么封裝一個(gè)view的

  • 可以通過(guò)純代碼或者xib的方式來(lái)封裝子控件
  • 建立一個(gè)跟view相關(guān)的模型翅娶,然后將模型數(shù)據(jù)傳給view,通過(guò)模型上的數(shù)據(jù)給view的子控件賦值
/**  *  純代碼初始化控件時(shí)一定會(huì)走這個(gè)方法  */ 
- (instancetype)initWithFrame:(CGRect)frame
 {    
   if(self = [super initWithFrame:frame]) 
    {         
      [self setupUI];    
    }    
     return self; 
}  
/**  *  通過(guò)xib初始化控件時(shí)一定會(huì)走這個(gè)方法  */ 
- (id)initWithCoder:(NSCoder *)aDecoder {   
  if(self = [super initWithCoder:aDecoder]) {
         [self setupUI];    
   }   
  return self; 
}  
- (void)setupUI { 
    // 初始化代碼 
}

第三方框架

AFNetworking 底層原理分析

AFNetworking主要是對(duì)NSURLSession和NSURLConnection(iOS9.0廢棄)的封裝,其中主要有以下類(lèi):

  • AFHTTPRequestOperationManager:內(nèi)部封裝的是 NSURLConnection, 負(fù)責(zé)發(fā)送網(wǎng)絡(luò)請(qǐng)求, 使用最多的一個(gè)類(lèi)好唯。(3.0廢棄)
  • AFHTTPSessionManager:內(nèi)部封裝是 NSURLSession, 負(fù)責(zé)發(fā)送網(wǎng)絡(luò)請(qǐng)求,使用最多的一個(gè)類(lèi)竭沫。
  • AFNetworkReachabilityManager:實(shí)時(shí)監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài)的工具類(lèi)。當(dāng)前的網(wǎng)絡(luò)環(huán)境發(fā)生改變之后,這個(gè)工具類(lèi)就可以檢測(cè)到
  • AFSecurityPolicy:網(wǎng)絡(luò)安全的工具類(lèi), 主要是針對(duì) HTTPS 服務(wù)骑篙。
  • AFURLRequestSerialization:序列化工具類(lèi),基類(lèi)蜕提。上傳的數(shù)據(jù)轉(zhuǎn)換成JSON格式 (AFJSONRequestSerializer).使用不多。
  • AFURLResponseSerialization:反序列化工具類(lèi);基類(lèi).使用比較多
  • AFJSONResponseSerializer; JSON解析器,默認(rèn)的解析器.
  • AFHTTPResponseSerializer; 萬(wàn)能解析器; JSON和XML之外的數(shù)據(jù)類(lèi)型,直接返回二進(jìn) 制數(shù)據(jù).對(duì)服務(wù)器返回的數(shù)據(jù)不做任何處理.
  • AFXMLParserResponseSerializer; XML解析器;

描述下SDWebImage里面給UIImageView加載圖片的邏輯

SDWebImage 中為 UIImageView 提供了UIImageView+WebCache.h,
這個(gè)分類(lèi)中有一個(gè)最常用的接口
sd_setImageWithURL:placeholderImage:會(huì)在真實(shí)圖片出現(xiàn)前會(huì)先顯示占位圖片靶端,當(dāng)真實(shí)圖片被加載出來(lái)后再替換占位圖片谎势。
加載圖片的過(guò)程大致如下:

  • 首先會(huì)在 SDWebImageCache 中尋找圖片是否有對(duì)應(yīng)的緩存, 它會(huì)以u(píng)rl 作為數(shù)據(jù)的索引先在內(nèi)存中尋找是否有對(duì)應(yīng)的緩存
  • 如果緩存未找到就會(huì)利用通過(guò)MD5處理過(guò)的key來(lái)繼續(xù)在磁盤(pán)中查詢對(duì)應(yīng)的數(shù)據(jù), 如果找到了, 就會(huì)把磁盤(pán)中的數(shù)據(jù)加載到內(nèi)存中凛膏,并將圖片顯示出來(lái)
  • 如果在內(nèi)存和磁盤(pán)緩存中都沒(méi)有找到,就會(huì)向遠(yuǎn)程服務(wù)器發(fā)送請(qǐng)求它浅,開(kāi)始下載圖片
  • 下載后的圖片會(huì)加入緩存中译柏,并寫(xiě)入磁盤(pán)中
  • 整個(gè)獲取圖片的過(guò)程都是在子線程中執(zhí)行,獲取到圖片后回到主線程將圖片顯示出來(lái)

SDWebImage原理: 調(diào)用類(lèi)別的方法: 1. 從內(nèi)存(字典)中找圖片(當(dāng)這個(gè)圖片在本次使用程序的過(guò)程中已經(jīng)被加載過(guò))姐霍,找到直接使用鄙麦。 2. 從沙盒中找(當(dāng)這個(gè)圖片在之前使用程序的過(guò)程中被加載過(guò)),找到使用镊折,緩存到內(nèi)存中胯府。 3. 從網(wǎng)絡(luò)上獲取,使用恨胚,緩存到內(nèi)存骂因,緩存到沙盒。

編碼格式(優(yōu)化細(xì)節(jié))

在 Objective-C 中赃泡,enum 建議使用 NS_ENUM 和 NS_OPTIONS 宏來(lái)定義枚舉類(lèi)型寒波。

//定義一個(gè)枚舉(比較嚴(yán)密)
typedef NS_ENUM(NSInteger, BRUserGender) { 
    BRUserGenderUnknown,    // 未知     
    BRUserGenderMale,       // 男性 
    BRUserGenderFemale,      // 女性    
    BRUserGenderNeuter      // 無(wú)性 
};
@interface BRUser : NSObject<NSCopying> 
@property (nonatomic, readonly, copy) NSString *name; 
@property (nonatomic, readonly, assign) NSUInteger age; 
@property (nonatomic, readonly, assign) BRUserGender gender; 
 - (instancetype)initWithName:(NSString *)name age:(NSUInteger)age gender:(BRUserGender)gender;  
@end  

避免使用C語(yǔ)言中的基本數(shù)據(jù)類(lèi)型,建議使用 Foundation 數(shù)據(jù)類(lèi)型

對(duì)應(yīng)關(guān)系如下:
int -> NSInteger unsigned -> NSUInteger float -> CGFloat 動(dòng)畫(huà)時(shí)間 -> NSTimeInterval

如何實(shí)行cell的動(dòng)態(tài)的行高

如果希望每條數(shù)據(jù)顯示自身的行高升熊,必須設(shè)置兩個(gè)屬性俄烁,

  • 預(yù)估行高
    設(shè)置預(yù)估行高 tableView.estimatedRowHeight = 200。
  • 自定義行高
    設(shè)置定義行高 tableView.estimatedRowHeight = UITableViewAutomaticDimension级野。

如果要讓自定義行高有效页屠,必須讓容器視圖有一個(gè)自下而上的約束。

用StoryBoard開(kāi)發(fā)界面有什么弊端蓖柔?如何避免辰企?

使用簡(jiǎn)單邏輯頁(yè)面的跳轉(zhuǎn)是可以使用sb的,開(kāi)發(fā)比較塊况鸣。但是SB對(duì)于邏輯項(xiàng)目比較復(fù)雜的時(shí)候牢贸,開(kāi)發(fā)起來(lái)比較慢。
不適合多人合作開(kāi)發(fā)镐捧;也不利于版本的梗系和后期的維護(hù)十减。
使用sb在項(xiàng)目變異編譯的時(shí)候,也都會(huì)直接加載到內(nèi)存中愤估,造成內(nèi)存的浪費(fèi)。 可以使用xib來(lái)代替速址,編輯復(fù)雜邏輯界面時(shí)候可以使用純碼編寫(xiě)玩焰。

Swift

類(lèi)(class)和結(jié)構(gòu)體(struct)有什么區(qū)別?

Swift 中芍锚,類(lèi)是引用類(lèi)型昔园,結(jié)構(gòu)體是值類(lèi)型蔓榄。值類(lèi)型在傳遞和賦值時(shí)將進(jìn)行復(fù)制,而引用類(lèi)型則只會(huì)使用引用對(duì)象的一個(gè)"指向"默刚。所以他們兩者之間的區(qū)別就是兩個(gè)類(lèi)型的區(qū)別甥郑。

請(qǐng)說(shuō)明并比較以下關(guān)鍵詞:Open, Public, Internal, File-private, Private

Swift 有五個(gè)級(jí)別的訪問(wèn)控制權(quán)限,從高到底依次為比如 Open, Public, Internal, File-private, Private荤西。
基本原則:高級(jí)別的變量不允許被定義為低級(jí)別變量的成員變量澜搅。
比如一個(gè) private 的 class 中不能含有 public 的 String。反之邪锌,低級(jí)別的變量卻可以定義在高級(jí)別的變量中勉躺。比如 public 的 class 中可以含有 private 的 Int。

  • Open 具備最高的訪問(wèn)權(quán)限觅丰。其修飾的類(lèi)和方法可以在任意 Module 中被訪問(wèn)和重寫(xiě)饵溅;它是 Swift 3 中新添加的訪問(wèn)權(quán)限。
  • Public 的權(quán)限僅次于 Open妇萄。與 Open 唯一的區(qū)別在于它修飾的對(duì)象可以在任意 Module 中被訪問(wèn)蜕企,但不能重寫(xiě)。
  • Internal 是默認(rèn)的權(quán)限冠句。它表示只能在當(dāng)前定義的 Module 中訪問(wèn)和重寫(xiě)轻掩,它可以被一個(gè) Module 中的多個(gè)文件訪問(wèn),但不可以被其他的 Module 中被訪問(wèn)轩端。
  • File-private 也是 Swift 3 新添加的權(quán)限放典。其被修飾的對(duì)象只能在當(dāng)前文件中被使用。例如它可以被一個(gè)文件中的 class基茵,extension奋构,struct 共同使用。
  • Private 是最低的訪問(wèn)權(quán)限拱层。它的對(duì)象只能在定義的作用域內(nèi)使用弥臼。離開(kāi)了這個(gè)作用域,即使是同一個(gè)文件中的其他作用域根灯,也無(wú)法訪問(wèn)径缅。

請(qǐng)說(shuō)明并比較以下關(guān)鍵詞:strong, weak, unowned

Swift 的內(nèi)存管理機(jī)制與 Objective-C一樣為 ARC(Automatic Reference Counting)。
它的基本原理是烙肺,一個(gè)對(duì)象在沒(méi)有任何強(qiáng)引用指向它時(shí)纳猪,其占用的內(nèi)存會(huì)被回收。反之桃笙,只要有任何一個(gè)強(qiáng)引用指向該對(duì)象氏堤,它就會(huì)一直存在于內(nèi)存中。

  • strong 代表著強(qiáng)引用搏明,是默認(rèn)屬性鼠锈。
    當(dāng)一個(gè)對(duì)象被聲明為 strong 時(shí)闪檬,就表示父層級(jí)對(duì)該對(duì)象有一個(gè)強(qiáng)引用的指向。此時(shí)該對(duì)象的引用計(jì)數(shù)會(huì)增加1购笆。
  • weak 代表著弱引用粗悯。
    當(dāng)對(duì)象被聲明為 weak 時(shí),父層級(jí)對(duì)此對(duì)象沒(méi)有指向同欠,該對(duì)象的引用計(jì)數(shù)不會(huì)增加1样傍。它在對(duì)象釋放后弱引用也隨即消失。繼續(xù)訪問(wèn)該對(duì)象行您,程序會(huì)得到 nil铭乾,不虧崩潰
  • unowned 與弱引用本質(zhì)上一樣。
    唯一不同的是娃循,對(duì)象在釋放后炕檩,依然有一個(gè)無(wú)效的引用指向?qū)ο螅皇?Optional 也不指向 nil捌斧。如果繼續(xù)訪問(wèn)該對(duì)象笛质,程序就會(huì)崩潰。
    加分回答
    weak 和 unowned 的引入是為了解決由 strong 帶來(lái)的循環(huán)引用問(wèn)題捞蚂。
    簡(jiǎn)單來(lái)說(shuō)妇押,就是當(dāng)兩個(gè)對(duì)象互相有一個(gè)強(qiáng)指向去指向?qū)Ψ剑@樣導(dǎo)致兩個(gè)對(duì)象在內(nèi)存中無(wú)法釋放姓迅。

weak 和 unowned 的使用場(chǎng)景有如下差別:

  • 當(dāng)訪問(wèn)對(duì)象時(shí)該對(duì)象可能已經(jīng)被釋放了敲霍,則用 weak。比如 delegate 的修飾丁存。
  • 當(dāng)訪問(wèn)對(duì)象確定不可能被釋放肩杈,則用 unowned。比如 self 的引用解寝。
  • 實(shí)際上為了安全起見(jiàn)扩然,很多公司規(guī)定任何時(shí)候都使用 weak 去修飾。

在Swift和Objective-C的混編項(xiàng)目中聋伦,如何在Swift文件中調(diào)用Objective-C文件中已經(jīng)定義的方法夫偶?如何在Objective-C文件中調(diào)用Swift文件中定義的方法?

  • Swift中若要使用Objective-C代碼觉增,可以在ProjectName-Bridging-Header.h里添加Objective-C的頭文件名稱兵拢,Swift文件中即可調(diào)用相應(yīng)的Objective-C代碼。
    一般情況Xcode會(huì)在Swift項(xiàng)目中第一次創(chuàng)建Objective-C文件時(shí)自動(dòng)創(chuàng)建ProjectName-Bridging-Header.h文件逾礁。
  • Objective-C中若要調(diào)用Swift代碼说铃,可以導(dǎo)入Swift生成的頭函數(shù)ProjectName-Swift.h來(lái)實(shí)現(xiàn)。
  • Swift文件中若要規(guī)定固定的方法或?qū)傩员┞督oObjective-C使用,可以在方法或?qū)傩郧凹由螥objc來(lái)聲明截汪。如果該類(lèi)是NSObject子類(lèi),那么Swift會(huì)在非private的方法或?qū)傩郧白詣?dòng)加上@objc植捎。

實(shí)現(xiàn)一個(gè)函數(shù)衙解。求一個(gè)整型二維數(shù)組中所有元素之和

func sumPairs(_ nums: [[Int]]) -> Int {
  return nums.flatMap { $0 }.reduce(0) { $0 + $1 }
}

Swift 有函數(shù)式編程的思想。其中 flatMap, map, reduce, filter 是其代表的方法焰枢。
本題中考察了 flatMap 的降維思路蚓峦,以及 reduce 的基本使用。相比于一般的 for 循環(huán)济锄,這樣的寫(xiě)法要更加得簡(jiǎn)潔漂亮暑椰。

項(xiàng)目

  • 有已經(jīng)上線的項(xiàng)目么?
  • 項(xiàng)目里哪個(gè)部分是你完成的荐绝?(找一個(gè)亮點(diǎn)問(wèn)一下如何實(shí)現(xiàn)的)
  • 開(kāi)發(fā)過(guò)程中遇到過(guò)什么困難一汽,是如何解決的?

學(xué)習(xí)

  • 遇到一個(gè)問(wèn)題完全不能理解的時(shí)候低滩,是如何幫助自己理解的召夹?舉個(gè)例子?
  • 有看書(shū)的習(xí)慣么恕沫?最近看的一本是什么書(shū)监憎?有什么心得?
  • 有沒(méi)有使用一些筆記軟件婶溯?會(huì)在多平臺(tái)同步以及多渠道采集么鲸阔?(如果沒(méi)有,問(wèn)一下是如何復(fù)習(xí)知識(shí)的)
  • 有沒(méi)有使用清單類(lèi)迄委,日歷類(lèi)的軟件褐筛?(如果沒(méi)有,問(wèn)一下是如何安排跑筝,計(jì)劃任務(wù)的)
  • 平乘蓝铮看博客么?有沒(méi)有自己寫(xiě)過(guò)曲梗?(如果寫(xiě)赞警,有哪些收獲?如果沒(méi)有寫(xiě)虏两,問(wèn)一下不寫(xiě)的原因)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末愧旦,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子定罢,更是在濱河造成了極大的恐慌笤虫,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異琼蚯,居然都是意外死亡酬凳,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門(mén)遭庶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宁仔,“玉大人,你說(shuō)我怎么就攤上這事峦睡◆嵘唬” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵榨了,是天一觀的道長(zhǎng)煎谍。 經(jīng)常有香客問(wèn)我,道長(zhǎng)龙屉,這世上最難降的妖魔是什么呐粘? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮叔扼,結(jié)果婚禮上事哭,老公的妹妹穿的比我還像新娘。我一直安慰自己瓜富,他們只是感情好鳍咱,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著与柑,像睡著了一般谤辜。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上价捧,一...
    開(kāi)封第一講書(shū)人閱讀 51,578評(píng)論 1 305
  • 那天丑念,我揣著相機(jī)與錄音,去河邊找鬼结蟋。 笑死脯倚,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的嵌屎。 我是一名探鬼主播推正,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼宝惰!你這毒婦竟也來(lái)了植榕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤尼夺,失蹤者是張志新(化名)和其女友劉穎尊残,沒(méi)想到半個(gè)月后炒瘸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡寝衫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年顷扩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片慰毅。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡屎即,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出事富,到底是詐尸還是另有隱情,我是刑警寧澤乘陪,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布统台,位于F島的核電站,受9級(jí)特大地震影響啡邑,放射性物質(zhì)發(fā)生泄漏贱勃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一谤逼、第九天 我趴在偏房一處隱蔽的房頂上張望贵扰。 院中可真熱鬧,春花似錦流部、人聲如沸戚绕。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)舞丛。三九已至,卻和暖如春果漾,著一層夾襖步出監(jiān)牢的瞬間球切,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工绒障, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留吨凑,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓户辱,卻偏偏與公主長(zhǎng)得像鸵钝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子焕妙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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