iOS面試題-Swift篇

2021-02-14 iOS開發
http://www.cocoachina.com/articles/899004?filter=rec先介紹一下 SwiftSwift是蘋果在2014年6月WWDC發布的全新程式語言,借鑑了JS,Python,C#,Ruby等語言特性,看上去偏腳本化,Swift 仍支持 cocoa touch 框架

Swift更加安全,它是類型安全的語言。

Swift容易閱讀,語法和文件結構簡易化。

Swift更易於維護,文件分離後結構更清晰。

Swift代碼更少,簡潔的語法,可以省去大量冗餘代碼

Swift速度更快,運算性能更高


Swift 和OC 如何相互調用?類(class) 和 結構體(struct) 有什麼區別?在 Swift 中,class 是引用類型(指針類型), struct 是值類型

值類型在傳遞和賦值時將進行複製; 賦值給var、let或者給函數傳參,是直接將所有內容拷貝一份, 類似於對文件進行copy、paste操作,產生了全新的文件副本。屬於深拷貝(deep copy)

值類型: 比如結構體,枚舉,是在棧空間上存儲和操作的

引用類型只會使用引用對象的一個"指向"; 賦值給var、let或者給函數傳參,是將內存地址拷貝一份,類似於製作一個文件的替身(快捷方式、連結),指向的是同一個文件。屬於淺拷貝(shallow copy)

引用類型: 比如 Class,是在堆空間上存儲和操作的

class 和 struct 比較,優缺點?class 有以下功能,struct 是沒有的:*

class可以繼承,子類可以使用父類的特性和方法

類型轉換可以在運行時檢查和解釋一個實例對象

class可以用 deinit來釋放資源

一個類可以被多次引用

結構較小,適用於複製操作,相比較一個class 實例被多次引用,struct 更安全

無需擔心內存洩露問題

Swift 中,什麼可選型(Optional)

在 Swift 中,可選型是為了表達一個變量為空的情況,當一個變量為空,他的值就是 nil

在類型名稱後面加個問號? 來定義一個可選型

值類型或者引用類型都可以是可選型變量

var name: String? // 默認為 nil
var age: Int? // 默認為nil
print(name, age) // 列印 nil, nil

Swift,什麼是泛型?

泛型主要是為增加代碼的靈活性而生的,它可以是對應的代碼滿足任意類型的的變量或方法;

泛型可以將類型參數化,提高代碼復用率,減少代碼量

// 實現一個方法,可以交換實現任意類型
func swap<T>(a: inout T, b: inout T) {
(a, b) = (b, a)
}


訪問控制關鍵字 open, public, internal, fileprivate, private 的區別?Swift 中有個5個級別的訪問控制權限,從高到低依次是 open, public, internal, fileprivate, private它們遵循的基本規則: 高級別的變量不允許被定義為低級別變量的成員變量,比如一個 private 的 class 內部允許包含 public的 String值,反之低級變量可以定義在高級別變量中;

open: 具備最高訪問權限,其修飾的類可以和方法,可以在任意 模塊中被訪問和重寫.

public: 權限僅次於 open,和 open 唯一的區別是: 不允許其他模塊進行繼承、重寫

internal: 默認權限, 只允許在當前的模塊中訪問,可以繼承和重寫,不允許在其他模塊中訪問

fileprivate: 修飾的對象只允許在當前的文件中訪問;

private: 最低級別訪問權限,只允許在定義的作用域內訪問

關鍵字:Strong,Weak,Unowned 區別?

Swift 的內存管理機制同OC一致,都是ARC管理機制; Strong,和 Weak用法同OC一樣

Unowned(無主引用), 不會產生強引用,實例銷毀後仍然存儲著實例的內存地址(類似於OC中的unsafe_unretained), 試圖在實例銷毀後訪問無主引用,會產生運行時錯誤(野指針)


如何理解copy-on-write?值類型(比如:struct),在複製時,複製對象與原對象實際上在內存中指向同一個對象,若且唯若修改複製的對象時,才會在內存中創建一個新的對象

為了提升性能,Struct, String、Array、Dictionary、Set採取了Copy On Write的技術

比如僅當有「寫」操作時,才會真正執行拷貝操作

對於標準庫值類型的賦值操作,Swift 能確保最佳性能,所有沒必要為了保證最佳性能來避免賦值


什麼是屬性觀察?屬性觀察是指在當前類型內對特性屬性進行監測,並作出響應,屬性觀察是 swift 中的特性,具有2種, willset 和 didset

var title: String {
willSet {
print("willSet", newValue)

}
didSet {
print("didSet", oldValue, title)
}
}


swift 為什麼將 String,Array,Dictionary設計為值類型?值類型和引用類型相比,最大優勢可以高效的使用內存,值類型在棧上操作,引用類型在堆上操作,棧上操作僅僅是單個指針的移動,而堆上操作牽涉到合併,位移,重連結,Swift 這樣設計減少了堆上內存分配和回收次數,使用 copy-on-write將值傳遞與複製開銷降到最低
如何將Swift 中的協議(protocol)中的部分方法設計為可選(optional)?

@objc protocol someProtocol {
@objc optional func test()
}

protocol someProtocol {
func test()
}

extension someProtocol{
func test() {
print("test")
}
}


比較Swift 和OC中的初始化方法 (init) 有什麼不同?swift 的初始化方法,更加嚴格和準確, swift初始化方法需要保證所有的非optional的成員變量都完成初始化, 同時 swfit 新增了convenience和 required兩個修飾初始化器的關鍵字
比較 Swift和OC中的 protocol 有什麼不同?

Swift 和OC中的 protocol相同點在於: 兩者都可以被用作代理;

不同點: Swift中的 protocol還可以對接口進行抽象,可以實現面向協議,從而大大提高編程效率,Swift中的protocol可以用於值類型,結構體,枚舉;


swift 和OC 中的自省 有什麼區別?自省在OC中就是判斷某一對象是否屬於某一個類的操作,有以下2種方式

[obj iskinOfClass:[SomeClass class]]
[obj isMemberOfClass:[SomeClass class]]


什麼是函數重載? swift 支不支持函數重載?

函數重載是指: 函數名稱相同,函數的參數個數不同, 或者參數類型不同,或參數標籤不同, 返回值類型與函數重載無關

swift 支持函數重載


swift 中的枚舉,關聯值 和 原始值的區分?

// 關聯值
enum Date {
case digit(year: Int, month: Int, day: Int)
case string(String)
}

// 原始值
enum Grade: String {
case perfect = "A"
case great = "B"
case good = "C"
case bad = "D"
}


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

{
(參數列表) -> 返回值類型 in 函數體代碼
}


什麼是尾隨閉包?

將一個很長的閉包表達式作為函數的最後一個實參

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

尾隨閉包是一個被書寫在函數調用括號外面(後面)的閉包表達式

// fn 就是一個尾隨閉包參數
func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) {
print(fn(v1, v2))
}

// 調用
exec(v1: 10, v2: 20) {
$0 + $1
}


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

非逃逸閉包、逃逸閉包,一般都是當做參數傳遞給函數

非逃逸閉包:閉包調用發生在函數結束前,閉包調用在函數作用域內

逃逸閉包:閉包有可能在函數結束後調用,閉包調用逃離了函數的作用域,需要通過@escaping聲明

// 定義一個數組用於存儲閉包類型
var completionHandlers: [() -> Void] = []

// 在方法中將閉包當做實際參數,存儲到外部變量中
func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {
completionHandlers.append(completionHandler)
}


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

func getFirstPositive(_ v1: Int, _ v2: @autoclosure () -> Int) -> Int? {
return v1 > 0 ? v1 : v2()
}
getFirstPositive(10, 20)

為了避免與期望衝突,使用了@autoclosure的地方最好明確注釋清楚:這個值會被推遲執行

@autoclosure 會自動將 20 封裝成閉包 { 20 }

@autoclosure 只支持 () -> T 格式的參數

@autoclosure 並非只支持最後1個參數

有@autoclosure、無@autoclosure,構成了函數重載

如果你想要自動閉包允許逃逸,就同時使用 @autoclosure 和 @escaping 標誌。
swift中, 存儲屬性和計算屬性的區別?

類似於成員變量這個概念

存儲在實例對象的內存中

結構體、類可以定義存儲屬性

枚舉不可以定義存儲屬性

本質就是方法(函數)

不佔用實例對象的內存

枚舉、結構體、類都可以定義計算屬性

struct Circle {
// 存儲屬性
var radius: Double
// 計算屬性
var diameter: Double {
set {
radius = newValue / 2
}
get {
return radius * 2
}
}
}


什麼是延遲存儲屬性(Lazy Stored Property)?使用lazy可以定義一個延遲存儲屬性,在第一次用到屬性的時候才會進行初始化(類似OC中的懶加載)

lazy屬性必須是var,不能是let

如果多條線程同時第一次訪問lazy屬性

class PhotoView {
// 延遲存儲屬性
lazy var image: Image = {
let url = "https://...x.png"
let data = Data(url: url)
return Image(data: data)
}()
}


什麼是屬性觀察器?可以為非lazy的var存儲屬性設置屬性觀察器,通過關鍵字willSet和didSet來監聽屬性變化

struct Circle {
var radius: Double {
willSet {
print("willSet", newValue)
}
didSet {
print("didSet", oldValue, radius)
}
}
init() {
self.radius = 1.0
print("Circle init!")
}
}


swift中什麼類型屬性(Type Property)?

嚴格來說,屬性可以分為

實例屬性(Instance Property): 只能通過實例對象去訪問

類型屬性(Type Property):只能通過類型去訪問

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

struct Car {
static var count: Int = 0
init() {
Car.count += 1
}
}

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

存儲類型屬性默認就是lazy,會在第一次使用的時候才初始化

就算被多個線程同時訪問,保證只會初始化一次

存儲類型屬性可以是let

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


swift 中如何使用單例模式?可以通過類型屬性+let+private 來寫單例; 代碼如下如下

public class FileManager {
public static let shared = {
// ....
// ....
return FileManager()
}()
private init() { }
}


swift 中的下標是什麼?

class Point {
var x = 0.0, y = 0.0
subscript(index: Int) -> Double {
set {
if index == 0 {
x = newValue
} else if index == 1 {
y = newValue }
}
get {
if index == 0 {
return x
} else if index == 1 {
return y
}
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) {
statements
}
// 便捷初始化器
convenience init(parameters) {
statements
}

指定初始化器必須從它的直系父類調用指定初始化器

便捷初始化器必須從相同的類裡調用另一個初始化器

便捷初始化器最終必須調用一個指定初始化器


什麼可選鏈?可選鏈是一個調用和查詢可選屬性、方法和下標的過程,它可能為 nil 。如果可選項包含值,屬性、方法或者下標的調用成功;如果可選項是 nil ,屬性、方法或者下標的調用會返回 nil 。多個查詢可以連結在一起,如果鏈中任何一個節點是 nil ,那麼整個鏈就會得體地失敗。什麼是運算符重載(Operator Overload)?
類、結構體、枚舉可以為現有的運算符提供自定義的實現,這個操作叫做:運算符重載

struct Point {
var x: Int
var y: Int

// 重載運算符
static func + (p1: Point, p2: Point) -> Point {
return Point(x: p1.x + p2.x, y: p1.y + p2.y)
}
}

var p1 = Point(x: 10, y: 10)
var p2 = Point(x: 20, y: 20)
var p3 = p1 + p2

連結 | http://www.cocoachina.com/articles/899004?filter=rec

在看點這裡好文分享給更多人↓↓

相關焦點

  • [Swift基礎] 麥子學院iOS開發視頻教程從入門到精通
    第一階段:語言基礎和iOS入門1、秒學Swift開發語言,坐標系計算機語言學法2、初始Objective-C3、iOS8 App開發快速入門4、iOS開發語言 swift 2.2基礎第二階段:玩轉界面1、swift2.0-iOS玩轉UIKit2、IOS動畫編程3、IOS多點觸控與手勢識別
  • iOS 面試題(12):按層遍歷二叉樹的節點
    我春節在家準備了 5 篇面試題系列的文章,想著大家過節估計也沒興趣閱讀,所以節後再發。這些題目大都選自 LeetCode,屬於簡單到中等類型的難度。還在糾結學算法有沒有用的同學,請參閱:搞 iOS 的學算法有意義嗎?解題代碼都是使用 Swift 完成的,我也儘量在代碼中使用了 Swift 語言的一些特性,大家可以順便學學 Swift。Have fun!
  • Apple 在 iOS 13.1 中使用 Swift 開發的應用程式
    /usr/lib/swift/libswiftMetalKit.dylib/usr/lib/swift/libswiftCoreImage.dylib/usr/lib/swift/libswiftObjectiveC.dylib/usr/lib/swift/libswiftVision.dylib/usr/lib/swift/libswiftSpeech.dylib
  • 從Java到Swift
    (文中的示例代碼均來自The Swift Programming Language:https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/index.html?
  • 我的iOS面試之旅
    第一次面試試水金三銀四,三月份求職機會還是挺多的,在boss直聘上稍微整理了下簡歷,就收到了好多面試邀請,3月7號利用休息的半天時間出去試了水,約了5家面試,因為太匆忙了,最後只面試了4家公司,有創業型的公司:蛋殼公寓,有中型的公司:知乎,也有大一點的上市公司:百乘金控集團、完美世界。
  • iOS 面試之道:117 道 iOS 面試題全解析
    因為這一系列的因素,促使我有強烈願望改變技術書出版流程和售賣方式,大致七八個月前道長和巧哥跟我聊到計劃從面試的角度寫一本系統的 iOS 技術書籍時候,我們一拍即合,有了今天的這次合作。好了,接下來該認真聊下今天的主角《iOS 面試之道》了。
  • 百度、阿里、騰訊、京東等面試算法題
    這是無量測試之道的第180篇原創今天給大家分享的是字符串相關的算法面試題。
  • 用 Swift 來刷 leet code 吧
    本來 hash 需要的額外空間很小,但因為 swift 要遍歷字符串中的字符必須把字符數組存出來一份。所以空間複雜度為 O(n)。之所以寫法很不簡潔,多出了許多臨時變量,完全是 swift 的鍋。謹記 swift 字符串的特性,由於每一位字符長度不一定相等,它是不能隨機訪問的。也就是說,如果不存臨時變量,取某一位的字符、取字符串的長度、截取子串,全部都是 n 級別的…… 所以一再超時。
  • 關於面試總結13-app測試面試題
    面試app測試崗位會被問到哪些問題,怎樣讓面試管覺得你對APP測試很精通的樣子?本篇總結了app測試面試時候經常被問的10個相關問題1.什麼是activity?2.Activity生命周期?3.Android四大組件?4.app測試和web測試有什麼區別?5.android和ios測試區別?6.app出現ANR,是什麼原因導致的?
  • iOS面試指南(2020年6月)參考答案
    作者丨zhangferry來源丨iOS成長之路上個月發了這篇iOS面試總結(2020年6月)[1],沒想到挺受大家歡迎,本來是沒打算為它寫答案,但有幾個人建議我最好出一篇答案,提的人多了我就答應了下來。因為最近比較忙,斷斷續續總算補完了,就有了這篇文章,希望它對大家還有用處。
  • 2018年 iOS 面試心得
    很感謝面試官給我這次機會,因為並不是所有人都會認可你的努力,生活本來就沒有任何理所應當。具體的面了哪些公司,有哪些面試題在這裡就不分享了,因為感覺借鑑意義並不是很大。面試題方面筆者會專門在下一篇出一套自己認為可以用來面試高級 iOS 的面試題。所以請對面試題關注比較大的同學耐心等待1個星期。本篇主要分享的是筆者在這階段是如何準備面試的。
  • iOS代碼掃描從放棄到入門
    可年前線上面試,年後入職。簡歷可發送至 magaofei@tal.com前言我司今年開始嘗試一些代碼質量相關建設,比如組織codereview、修復代碼掃描漏洞.這是一個很好的現象,當我們為了快速迭代,往往為了讓需求上線,導致代碼並不很規範,時間長了就留下了一堆技術債.
  • 在經歷了6個月的學習後,我終於上架了自己的第一款APP---201807期iOS群問答精華整理
    /20180720/24254.html  8.這一篇百度 iOS 面試總結轟動整個開發界【頭條熱搜】https://www.jianshu.com/p/9c9dfa07b9a1  9.對 iOS app 進行安全加固http://www.cocoachina.com/ios/20180719/24229.html
  • 《 Swift 程式語言》中文版教程開源
    https://github.com/SwiftGGTeam/the-swift-programming-language-in-chinese項目使用GitBook製作的,可以在線閱讀,原文和翻譯版網址如下。
  • iOS入門基礎
    media ->cocoa touch 核心系統->核心服務->媒體服務層->可觸摸層 (二)IOS基於UNIX系統 二、蘋果開發網站 https://developer.apple.com/ 三、開發ios
  • 13歲iOS開發者:Swift開發Sprite Kit遊戲實踐
    本文作者Ajay Venkat是一名年僅13歲的iOS開發者,他非常喜歡用蘋果的Sprite Kit 2D遊戲框架來開發iOS遊戲,在了解到很多同齡孩子也對學習如何使用Sprite Kit來開發iOS遊戲非常感興趣之後,他以自己用Swift語言所開發的一款名為「Space Monkey」的遊戲為例,在Ray Wenderlich上寫下了這篇指南,以下為譯文:
  • 2021面試熱點預測題!--- ---公務員面試
    參加了省考的小夥伴們,你們開始複習面試了嗎?很多考生覺得筆試才過去沒多久,時間還比較充裕,所以並沒有認真開始複習面試。老師還是要提醒大家早做準備。  今天跟大家分享一道面試題66篇面試預測已整理
  • 測試面試題集錦(一)| 軟體測試常見必考問題與流程篇(附答案)
    本系列文章總結歸納了一些軟體測試工程師常見的面試題,主要來源於個人面試遇到的、網絡搜集(完善)、工作日常討論等,分為以下十個部分,供大家參考。如有錯誤的地方,歡迎指正。有更多的面試題或面試中遇到的坑,也歡迎補充分享。希望大家都能找到滿意的工作,共勉之!
  • 10個Objective-C基礎面試題,iOS面試必備
    如果你準備去面試一個iOS開發崗位,那麼本文也許可以幫助你提前準備一些iOS面試題,這些面試題都是 Objective-C基礎面試題,一起來看看。1、#import和#include的區別,@class代表什麼?