iOS面試題 Swift篇(二)

2021-10-11 21:46:52 字數 3112 閱讀 1777

swift 中的閉包結構是什麼樣子的

什麼是尾隨閉包

將乙個很長的閉包表示式作為函式的最後乙個實參

使用尾隨閉包可以增強函式的可讀性

尾隨閉包是乙個被書寫在函式呼叫括號外面(後面)的閉包表示式

// fn 就是乙個尾隨閉包引數

func exec(v1: int, v2: int, fn: (int, int) -> int)

// 呼叫

exec(v1: 10, v2: 20)

什麼是逃逸閉包

當閉包作為乙個實際引數傳遞給乙個函式或者變數的時候,我們就說這個閉包逃逸了,可以在形式引數前寫 @escaping 來明確閉包是允許逃逸的。

// 定義乙個陣列用於儲存閉包型別

var completionhandlers: [() -> void] =

// 在方法中將閉包當做實際引數,儲存到外部變數中

func somefunctionwithescapingclosure(completionhandler: @escaping () -> void)

如果你不標記函式的形式引數為 @escaping ,你就會遇到編譯時錯誤。

什麼是自動閉包

自動閉包是一種自動建立的用來把作為實際引數傳遞給函式的表示式打包的閉包。它不接受任何實際引數,並且當它被呼叫時,它會返回內部打包的表示式的值。這個語法的好處在於通過寫普通表示式代替顯式閉包而使你省略包圍函式形式引數的括號

func getfirstpositive(_ v1: int, _ v2: @autoclosure () -> int) -> int? 

getfirstpositive(10, 20)

swift中, 儲存屬性和計算屬性的區別

儲存屬性(stored property)

計算屬性(computed property)

struct circle 

get

}}

什麼是延遲儲存屬性(lazy stored property)

使用lazy可以定義乙個延遲儲存屬性,在第一次用到屬性的時候才會進行初始化(類似oc中的懶載入)

class photoview ()

}

什麼是屬性觀察器

可以為非lazy的var儲存屬性設定屬性觀察器,通過關鍵字willset和didset來監聽屬性變化

struct circle 

didset

}init()

}

swift中什麼型別屬性(type property)

嚴格來說,屬性可以分為

可以通過static定義型別屬性 p如果是類,也可以用關鍵字class

struct car 

}

不同於儲存例項屬性,你必須給儲存型別屬性設定初始值

因為型別沒有像例項物件那樣的init初始化器來初始化儲存屬性

儲存型別屬性預設就是lazy,會在第一次使用的時候才初始化

就算被多個執行緒同時訪問,保證只會初始化一次

儲存型別屬性可以是let

列舉型別也可以定義型別屬性(儲存型別屬性、計算型別屬性)

swift 中如何使用單例模式

可以通過型別屬性+let+private 來寫單例; **如下如下

public class filemanager ()

private init()

}

swift 中的下標是什麼

使用subscript可以給任意型別(列舉、結構體、類)增加下標功能,有些地方也翻譯為:下標指令碼

subscript的語法類似於例項方法、計算屬性,本質就是方法(函式)

class point  else if index == 1 

}get else if index == 1

return 0}}

}var p = point()

// 下標賦值

p[0] = 11.1

p[1] = 22.2

// 下標訪問

print(p.x) // 11.1

print(p.y) // 22.2

簡要說明swift中的初始化器

// 指定初始化器

init(parameters)

// 便捷初始化器

convenience init(parameters)

規則:

初始化器的相互呼叫規則

什麼可選鏈

可選鏈是乙個呼叫和查詢可選屬性、方法和下標的過程,它可能為 nil 。如果可選項包含值,屬性、方法或者下標的呼叫成功;如果可選項是 nil ,屬性、方法或者下標的呼叫會返回 nil 。多個查詢可以鏈結在一起,如果鏈中任何乙個節點是 nil ,那麼整個鏈就會得體地失敗

多個?可以鏈結在一起

如果鏈中任何乙個節點是nil,那麼整個鏈就會呼叫失敗

什麼是運算子過載(operator overload)

類、結構體、列舉可以為現有的運算子提供自定義的實現,這個操作叫做:運算子過載

struct point 

}var p1 = point(x: 10, y: 10)

var p2 = point(x: 20, y: 20)

var p3 = p1 + p2

iOS面試題 Swift篇(一)

swift是蘋果在2014年6月wwdc發布的全新程式語言,借鑑了js,python,c ruby等語言特性,看上去偏指令碼化,swift 仍支援 cocoa touch 框架 swift更加安全,它是型別安全的語言。swift容易閱讀,語法和檔案結構簡易化。swift更易於維護,檔案分離後結構更清...

iOS面試題(二)

1.self.和self的區別?id,nil代表什麼?2.nsdate如何格式化輸出?對於格式是否有要求?例項化乙個nsdateformatter物件nsdateformatter dateformatter nsdateformatter alloc init 設定時間格式,這裡可以設定成自己需要...

iOS面試題 效能優化篇

降低包大小需要從兩方面著手 1 模擬器debug中color blended layers紅色區域表示圖層發生了混合 2 instrument 選中core animation 勾選color blended layers 避免圖層混合 uilabel圖層混合解決方法 ios8以後設定背景色為非透明...