# Swift學(xué)習(xí) # 簡單面試題

1.什么是函數(shù)式編程糟需?

函數(shù)式編程其實是一種編程思想, 代碼寫出來只是它的表現(xiàn)形式

在面向?qū)ο蟮木幊趟枷胫? 我們將要解決的一個個問題, 抽象成一個個類, 通過給類定義屬性和方法, 讓類幫助我們解決需要處理的問題.(其實面向?qū)ο笠步忻钍骄幊? 就像給對象下一個個命令)

而在函數(shù)式編程中, 我們則通過函數(shù)描述我們要解決的問題, 以及解決問題需要怎樣的方案.

RxSwift

2.swift相對于OC有哪些優(yōu)點?

1览芳、swift語法簡單易讀斜姥、代碼更少,更加清晰沧竟、易于維護

2铸敏、更加安全,optional的使用更加考驗程序員對代碼安全的掌控

3悟泵、泛型杈笔、結(jié)構(gòu)體、枚舉都很強大

4糕非、函數(shù)為一等公民蒙具,便捷的函數(shù)式編程

5、有命名空間 基于module

6峰弹、類型判斷

oc的優(yōu)點店量、運行時

3.什么是泛型,swift在哪些地方使用了泛型?

泛型(generic)可以使我們在程序代碼中定義一些可變的部分鞠呈,在運行的時候指定融师。使用泛型可以最大限度地重用代碼、保護類型的安全以及提高性能蚁吝。

例如 optional 中的 map旱爆、flatMap 、?? (泛型加逃逸閉包的方式窘茁,做三目運算)

4.defer怀伦、guard的作用?

defer 包體中的內(nèi)容一定會在離開作用域的時候執(zhí)行

guard 過濾器山林,攔截器

5.swift語法糖 房待?!的本質(zhì)(實現(xiàn)原理)

驼抹? 為optional的語法糖

Optional< T > 是一個包含了 nil 和 普通類型的枚舉桑孩,確保使用者在變量為nil的情況下的處理

!  為optional 強制解包 的語法糖

6.舉例swift中模式匹配的作用?

模式匹配: 在switch中體現(xiàn)最明顯

通配符模式: _

標(biāo)識符模式:let i = 1

值綁定模式:case .Student(let name) 或者 case let .Student(name)

元祖模式:case (let code, _)

可選模式:if case let x框冀? = someOptional { }

類型轉(zhuǎn)換模式:case is Int:  或者  case let n as String:

表達式模式:范圍匹配 case (0..<2)  case(0...2, 2...4)

條件句中使用where: case (let age) where age > 30

if case let:if case let .Student(name) = xiaoming { }

for case let: for case let x in array where x > 10 {}  或者 for x in array where x > 10

7.swift中closure與OC中block的區(qū)別流椒?

1、closure是匿名函數(shù)明也、block是一個結(jié)構(gòu)體對象

2宣虾、都能捕獲變量

3惯裕、closure通過逃逸閉包來在block內(nèi)部修改變量,block 通過 __block 修飾符

8.什么是capture list绣硝,舉例說明用處蜻势?

捕獲列表

weak  unowned

9.swift中private與fileprivate的區(qū)別?

private的作用域被約束與被定義的當(dāng)前類作用域域那,fileprivate作用域是整個文件

10.Set 獨有的方法有哪些咙边?

intersect(_:)// 根據(jù)兩個集合中都包含的值創(chuàng)建的一個新的集合
exclusiveOr(_:) // 根據(jù)只在一個集合中但不在兩個集合中的值創(chuàng)建一個新的集合
union(_:) // 根據(jù)兩個集合的值創(chuàng)建一個新的集合
subtract(_:) //根據(jù)不在該集合中的值創(chuàng)建一個新的集合

isSubsetOf(_:) //判斷一個集合中的值是否也被包含在另外一個集合中
isSupersetOf(_:) //判斷一個集合中包含的值是否含有另一個集合中所有的值
isStrictSubsetOf(:) isStrictSupersetOf(:) //判斷一個集合是否是另外一個集合的子集合或者父集合并且和特定集合不相等
isDisjointWith(_:) //判斷兩個集合是否不含有相同的值

11.實現(xiàn)一個 min 函數(shù),返回兩個元素較小的元素

func minNum<T: Comparable>(a: T, b: T) -> T {
    return a > b ? a : b
}

12.map次员、filter、reduce 的作用

1王带、map 是Array類的一個方法淑蔚,我們可以使用它來對數(shù)組的每個元素進行轉(zhuǎn)換
let intArray = [1, 3, 5]
let stringArr = intArray.map {
            return "\($0)"
        }
// ["1", "3", "5"]

2、filter 用于選擇數(shù)組元素中滿足某種條件的元素
let filterArr = intArray.filter {
    return $0 > 1
}
//[3, 5]

3愕撰、reduce 把數(shù)組元素組合計算為一個值
let result = intArray.reduce(0) {
    return $0 + $1
}
//9

13.map 與 flatmap 的區(qū)別

1刹衫、map 可以對一個集合類型的所有元素做一個映射操作


2、和map 不同搞挣,flatmap 在之前版本有兩個定義带迟,分別是:
func flatMap(transform: (Self.Generator.Element) throws -> T?) -> [T]
func flatMap(transform: (Self.Generator.Element) -> S) -> [S.Generator.Element]

swift 4.1 廢棄后改為

func flatMap(transform: (Self.Generator.Element) throws -> Sequence) -> [Sequence.Element]
func flatMap<U>(_ transform: (Wrapped) throws -> U?) rethrows -> U?


1) flatMap的第一個作用和map一樣,對一個集合類型的所有元素做一個映射操作,但是可以過濾為nil的情況

例如:
let array = [1,2,5,6,7,nil]
let array_map = array.map { $0 }
//[Optional(1), Optional(2), Optional(5), Optional(6), Optional(7), nil]
let array_flatmap = array_map.flatMap { $0 }
//[1, 2, 5, 6, 7]


2) 第二種情況可以進行“降維”操作

let array = [["1", "2"],["3", "4"]]
let array_map = array.map { $0 }
//[["1", "2"], ["3", "4"]]
let array_flatmap = array_map.flatMap { $0 }
//["1", "2", "3", "4"]

14.什么是 copy on write

copy on write, 寫時復(fù)制囱桨,簡稱COW仓犬,它通過淺拷貝(shallow copy)只復(fù)制引用而避免復(fù)制值;當(dāng)?shù)拇_需要進行寫入操作時舍肠,首先進行值拷貝搀继,在對拷貝后的值執(zhí)行寫入操作,這樣減少了無謂的復(fù)制耗時翠语。

15.如何獲取當(dāng)前代碼的函數(shù)名和行號

#function
#line
#file
#column

16.如何聲明一個只能被類 conform 的 protocol

protocol:class

17.String 與 NSString 的關(guān)系與區(qū)別

兩者可以隨意轉(zhuǎn)換

String為值類型叽躯,拷貝賦值需要值拷貝

NSString 傳遞指針

20.如何截取 String 的某段字符串

substring 已廢棄

let star = str.index(str.startIndex, offsetBy: 0)

let end = str.index(str.startIndex, offsetBy: 4)

let substr = str[star..<end]

21.throws 和 rethrows 的用法與作用

當(dāng)閉包參數(shù)會拋出異常時 使用throws

同時外部方法體返回結(jié)果需要  rethrows 異常

rethrows 可以用 throws 替換, 反過來不行

22.try? 和 try肌括!是什么意思

不處理錯誤点骑,拋出異常函數(shù)時, 如果函數(shù)拋出異常, 則返回 nil, 否則返回函數(shù)返回值的可選值,


保證不會出現(xiàn)錯誤 強制解,拋出異常的時候崩潰, 否則則返會函數(shù)返回值

23.associatedtype 的作用

關(guān)聯(lián)類型谍夭,關(guān)聯(lián)類型為協(xié)議中的某個類型提供了一個別名黑滴,其代表的真實類型在實現(xiàn)者中定義


//協(xié)議,使用關(guān)聯(lián)類型
protocol TableViewCell {
    associatedtype T
    func updateCell(_ data: T)
}
 
//遵守TableViewCell
class MyTableViewCell: UITableViewCell, TableViewCell {
    typealias T = Model
    func updateCell(_ data: Model) {
        // do something ...
    }
}

24.public 和 open 的區(qū)別

是否可以繼承

25.聲明一個只有一個參數(shù)沒有返回值閉包的別名

typealias MyBlock = (Int) -> (Void)

26.Self 的使用場景

例如:協(xié)議定義的時候慧库,如果需要使用到實現(xiàn)者的上下文怎么辦跷跪? 我們并不知道誰會實現(xiàn)自己

這個時候可以使用Self進行指代

27.dynamic 的作用

swift中的函數(shù)是靜態(tài)調(diào)用,靜態(tài)調(diào)用的方式會更快齐板,但是靜態(tài)調(diào)用的時候沒救不能從字符串查找到對于的方法地址吵瞻,這樣 與OC交互的時候葛菇,OC動態(tài)查找方法就會找不到,這個時候就可以通過使用 dynamic 標(biāo)記來告訴編譯器橡羞,這個方法要被動態(tài)調(diào)用的

swift中如果KVO監(jiān)聽屬性眯停,那么屬性就需要 dynamic 來標(biāo)記

28.什么時候使用 @objc

與OC 的交互部分

KOV 監(jiān)聽、動態(tài)方法查找等都需要

協(xié)議可選方法等

29.Optional(可選型) 是用什么實現(xiàn)的

枚舉 一個 為nil卿泽,一個為屬性值

30.如何自定義下標(biāo)獲取

extension Demo {
   subscript(index: Int) -> Int {
      get {
        // 返回一個適當(dāng)?shù)?Int 類型的值
      }
      set(newValue) {
        // 執(zhí)行適當(dāng)?shù)馁x值操作
      }
    }
}

31.inout 的作用

讓輸入?yún)?shù)可變 類似__block 的作用

32.Error 如果要兼容 NSError 需要做什么操作

Error是一個協(xié)議, swift中的Error 都是enum莺债, 可以轉(zhuǎn) NSError

如果需要Error有NSError的功能,實現(xiàn) LocalizedError CustomNSError 協(xié)議

33.下面的代碼都用了哪些語法糖

[1, 2, 3].map{ $0 * 2 }

array語法糖

尾部閉包語法糖

$0

34.什么是高階函數(shù)

map签夭、flatMap齐邦、filter、reduce第租?

35.下面的代碼會不會崩潰措拇,說出原因

var mutableArray = [1,2,3]
for _ in mutableArray {
    mutableArray.removeLast()
}

不會,值類型

36.給集合中元素是字符串的類型增加一個擴展方法慎宾,應(yīng)該怎么聲明

extension Array where Element == String { }

37.定義靜態(tài)方法時關(guān)鍵字 static 和 class 有什么區(qū)別

非class類型 一般 統(tǒng)一用 static  例如  枚舉 結(jié)構(gòu)體

protocol中 使用 static ,實現(xiàn)協(xié)議的 枚舉 結(jié)構(gòu)體 用 static

class 中使用  class static 都可以

38.一個 Sequence 的索引是不是一定從 0 開始丐吓?


39.數(shù)組都實現(xiàn)了哪些協(xié)議

Decodable Encodable Equatable Hashable  CustomStringConvertible, CustomDebugStringConvertible RandomAccessCollection, MutableCollection RangeReplaceableCollection CustomReflectable ExpressibleByArrayLiteral

40.如何自定義模式匹配

infix operator =~

func =~ (str: String, pattern: String) -> Bool {
    
}

infix、  prefix趟据、  postfix  用于自定義表達式的聲明券犁, 分別表示 中綴、前綴汹碱、后綴  

41.autoclosure 的作用

自動閉包粘衬,將參數(shù)自動封裝為閉包參數(shù)

42.下面代碼中 mutating 的作用是什么

struct Person {

    var name: String {
        mutating get {
            return store
        }
    }
}

結(jié)構(gòu)體中的 屬性可能發(fā)生改變

43.如何讓自定義對象支持字面量初始化

ExpressibleByArrayLiteral


ExpressibleByStringLiteral

44.為什么數(shù)組索引越界會崩潰,而字典用下標(biāo)取值時 key 沒有對應(yīng)值的話返回的是 nil 不會崩潰比被。

struct Array<Element> {
    subscript(index: Int) -> Element
}

struct Dictionary<Key: Hashable, Value> {
    subscript(key: Key) -> Value?
}

45.一個函數(shù)的參數(shù)類型只要是數(shù)字(Int色难、Float)都可以,要怎么表示等缀。

Int枷莉、Float 都有一個協(xié)議

func myMethod<T>(_ value: T) where T: Numeric {
    print(value + 1)
} 

或者 ExpressibleByIntegerLiteral 協(xié)議也行

46.Swift的靜態(tài)派發(fā)

很顯然靜態(tài)派發(fā)是一種更高效的方法,因為靜態(tài)派發(fā)免去了查表操作尺迂。

不過靜態(tài)派發(fā)是有條件的笤妙,方法內(nèi)部的代碼必須對編譯器透明,并且在運行時不能被更改噪裕,這樣編譯器才能幫助我們蹲盘。

Swift 中的值類型不能被繼承,也就是說值類型的方法實現(xiàn)不能被修改或者被復(fù)寫膳音,因此值類型的方法滿足靜態(tài)派發(fā)的要求召衔。

默認(rèn)靜態(tài)派發(fā),如果需要滿足動態(tài)派發(fā)祭陷,需要 dymanic修飾

47.Swift有哪些修飾符

open苍凛、public 趣席、internal、fileprivate醇蝴、private

48宣肚、實現(xiàn)一個函數(shù),輸入是任一整數(shù)悠栓,輸出要返回輸入的整數(shù) + 2

func plusTwo(one: Int) -> (Int) -> Int {
    return { (two: Int) in return two + one }
}

plusTwo(one: 4)(2)

49霉涨、Swift 到底是面向?qū)ο筮€是函數(shù)式的編程語言?

Swift 既是面向?qū)ο蟮牟咽剩质呛瘮?shù)式的編程語言笙瑟。
說 Swift 是 Object-oriented,是因為 Swift 支持類的封裝癞志、繼承逮走、和多態(tài),從這點上來看與 Java 這類純面向?qū)ο蟮恼Z言幾乎毫無差別今阳。
說 Swift 是函數(shù)式編程語言,是因為 Swift 支持 map, reduce, filter, flatmap 這類去除中間狀態(tài)茅信、數(shù)學(xué)函數(shù)式的方法盾舌,更加強調(diào)運算結(jié)果而不是中間過程。

50蘸鲸、class 和 struct 的區(qū)別

class 引用類型妖谴,可以繼承、多態(tài)酌摇,通過引用計數(shù)來管理

struct 是值類型膝舅,不通過引用計數(shù)來管理

51 swift版本協(xié)議通信方式

1、定義一個Mudule管理者窑多,處理注冊module仍稀,獲取module

2、定義一個Module倉庫埂息,構(gòu)建單例技潘,處理Module注冊事件以及初始化事件,mudule按字符串方式存入字典千康,block作為value享幽,muduleName作為key

3、定義一套Module協(xié)議拾弃,構(gòu)建注冊初始化方法值桩,application分發(fā)方法

4虱咧、各模塊的對外module入口需要實現(xiàn)此協(xié)議忱屑,可以不限于大模塊飘弧,比如一個業(yè)務(wù)大模塊庫分多個小部分模塊肌索,就可以多個小模塊單獨module

注冊module通過協(xié)議注冊,注冊后管理者匯總蛀蜜,匯總后Appdelegate 注冊Module刻两,module名稱配置在列表里,通過字符串轉(zhuǎn)類型將module構(gòu)建滴某,然后調(diào)用module的注冊方法初始化module

外部訪問之間只通過module溝通磅摹,降低耦合,參數(shù)拼裝可以public 也可以通過字典等方式霎奢,回調(diào)也可以publi 閉包等操作

52户誓、 路由地址組件通信方式

通過注冊urlpath + 閉包 來通信

但是url的方式就是安全性較低,比如我刪掉一半幕侠,編譯正常走帝美,但是執(zhí)行的時候肯定報錯,無法發(fā)現(xiàn)潛在bug晤硕,并且需要去注冊&維護路由表

path也不好管理悼潭,太過凌亂,沒有以模塊為主體

依賴程序員自己發(fā)現(xiàn)

53舞箍、Target-Action

需要按規(guī)則 寫target - action舰褪,通過反射去查找target 和 action,不需要注冊 維護了疏橄,但是無法解決潛在bug問題占拍,且必須準(zhǔn)守命名規(guī)則寫target和action

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市捎迫,隨后出現(xiàn)的幾起案子晃酒,更是在濱河造成了極大的恐慌,老刑警劉巖窄绒,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贝次,死亡現(xiàn)場離奇詭異,居然都是意外死亡颗祝,警方通過查閱死者的電腦和手機浊闪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來螺戳,“玉大人搁宾,你說我怎么就攤上這事【笥祝” “怎么了盖腿?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我翩腐,道長鸟款,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任茂卦,我火速辦了婚禮何什,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘等龙。我一直安慰自己处渣,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布蛛砰。 她就那樣靜靜地躺著罐栈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泥畅。 梳的紋絲不亂的頭發(fā)上荠诬,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音位仁,去河邊找鬼柑贞。 笑死,一個胖子當(dāng)著我的面吹牛聂抢,可吹牛的內(nèi)容都是我干的凌外。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼涛浙,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了摄欲?” 一聲冷哼從身側(cè)響起轿亮,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎胸墙,沒想到半個月后我注,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡迟隅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年但骨,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片智袭。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡奔缠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出吼野,到底是詐尸還是另有隱情校哎,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站闷哆,受9級特大地震影響腰奋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜抱怔,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一劣坊、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧屈留,春花似錦局冰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至乍狐,卻和暖如春赠摇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背浅蚪。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工藕帜, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人惜傲。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓洽故,卻偏偏與公主長得像,于是被迫代替她去往敵國和親盗誊。 傳聞我的和親對象是個殘疾皇子时甚,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345