柚子快報(bào)邀請(qǐng)碼778899分享:iOS 面試 Swift基礎(chǔ)題
一、Swift 存儲(chǔ)屬性和計(jì)算屬性比較:
存儲(chǔ)型屬性:用于存儲(chǔ)一個(gè)常量或者變量 計(jì)算型屬性: 計(jì)算性屬性不直接存儲(chǔ)值,而是用 get / set 來(lái)取值 和 賦值,可以操作其他屬性的變化.
計(jì)算屬性可以用于類(lèi)、結(jié)構(gòu)體和枚舉,存儲(chǔ)屬性只能用于類(lèi)和結(jié)構(gòu)體。存儲(chǔ)屬性可以是變量存儲(chǔ)屬性(用關(guān)鍵字 var 定義),也可以是常量存儲(chǔ)屬性(用關(guān)鍵字let定義),而計(jì)算屬性只能用var定義計(jì)算屬性不直接存儲(chǔ)值,而是提供一個(gè) getter 和一個(gè)可選的setter,來(lái)間接獲取和設(shè)置其他屬性或變量的值
var age = 12
var name = "小花"
var kind = "法斗"
//定義計(jì)算屬性的getter方法,該方法的返回值由age、name、kind三個(gè)存儲(chǔ)屬性決定
var petInfo:String{
get {
return "this is a pet which name is \(name),age is \(age), kind is \(kind)"
}
set (newInfo)
{
}
}
二、inout關(guān)鍵字有什么作用
需要用到inout 關(guān)鍵字,調(diào)用函數(shù)時(shí)加& inout關(guān)鍵字本質(zhì)是通過(guò)地址傳遞進(jìn)行值修改的
三、OC和Swift中的protocol
OC和SwiftProtocol的共同點(diǎn)
本質(zhì)都是抽取不同類(lèi)的共同方法和屬性(聲明),供遵循協(xié)議的類(lèi)或?qū)ο笫褂谩?都可以通過(guò)定義協(xié)議實(shí)例deleagate,來(lái)實(shí)現(xiàn)委托代理模式。 PS:類(lèi)比繼承的概念,繼承父類(lèi)的方式比較險(xiǎn)隘,子類(lèi)和父類(lèi)只能為同一基類(lèi),且方法都有實(shí)現(xiàn),需在子類(lèi)中override,并不能把方法和屬性完全獨(dú)立出來(lái),且不能多繼承。
OC和SwiftProtocol的區(qū)別(核心)
OC中的協(xié)議更單純的受限于委托代理的含義,多用于跨類(lèi)的傳值和回調(diào)通知。 而Swift是面向協(xié)議編程,其思想是通過(guò)抽取不同類(lèi)中的相同方法和屬性,實(shí)現(xiàn)模塊化減少耦合。 Swift可以通過(guò)協(xié)議extension擴(kuò)展,缺省實(shí)現(xiàn)協(xié)議的方法(OC不行)。 Swift的協(xié)議不需要單獨(dú)聲明協(xié)議對(duì)象(id delegate)和指定代理(delegate = self),只需要遵循協(xié)議的類(lèi)實(shí)現(xiàn)聲明,或使用協(xié)議的缺省實(shí)現(xiàn)。
四、Swift 中的 enum 和 OC 中 有什么區(qū)別
OC 1.oc的枚舉值相當(dāng)于這個(gè)文件中的一個(gè)局部變量,只能是整型 2.不同枚舉中,枚舉名稱(chēng)不可以一樣,在同一文件 Swift 3.枚舉里可以寫(xiě)方法 4.枚舉的rawValue可以是Float(float也是賦值的后面依次+1)或是String,或是沒(méi)有 5.可以用Rank(rawValue: 3)方法創(chuàng)建一個(gè)枚舉實(shí)例 6.枚舉實(shí)例可以帶參數(shù)
五、struct和class的區(qū)別
1)swift中所有值類(lèi)型:struct、enum使用直接派發(fā)。 2)swift中協(xié)議的extensions(類(lèi)似于OC的分類(lèi))使用直接派發(fā),初始聲明函數(shù)使用函數(shù)表派發(fā) 3)swift中class中extensions使用直接派發(fā),初始化聲明函數(shù)使用函數(shù)表派發(fā),dynamic修飾的函數(shù)使用消息派發(fā)。
Swift中,mutating關(guān)鍵字指的是可變即可修改。用在structure和enumeration中,雖然結(jié)構(gòu)體和枚舉可以定義自己的方法,但是默認(rèn)情況下,實(shí)例方法中是不可以修改值類(lèi)型的屬性。為了能夠在實(shí)例方法中修改屬性值,可以在方法定義前添加關(guān)鍵字mutating。 在 Swift 中,值類(lèi)型,存放在棧區(qū);引用類(lèi)型,存放在堆區(qū)。Swift 中,典型的有 struct,enum,以及 tuple 都是值類(lèi)型。 當(dāng)值類(lèi)型的變量作為參數(shù)被傳入函數(shù)時(shí),相當(dāng)于創(chuàng)建了新的常量并初始化為傳入的變量值,該參數(shù)的作用域及生命周期僅存在于函數(shù)體內(nèi)。 當(dāng)引用類(lèi)型的變量作為參數(shù)被傳入函數(shù)時(shí),相當(dāng)于創(chuàng)建了新的常量并初始化為傳入的變量引用,當(dāng)函數(shù)體內(nèi)操作參數(shù)指向的數(shù)據(jù),函數(shù)體外也受到了影響 6.當(dāng)你的項(xiàng)目的代碼是 Swift 和 Objective-C 混合開(kāi)發(fā)時(shí),你會(huì)發(fā)現(xiàn)在 Objective-C 的代碼里無(wú)法調(diào)用 Swift 的 Struct。因?yàn)橐?Objective-C 里調(diào)用 Swift 代碼的話(huà),對(duì)象需要繼承于 NSObject。 7.內(nèi)存分配:struct分配在棧中,class分配在堆中。struct比class更“輕量級(jí)”(struct是跑車(chē)跑得快,class是SUV可以載更多的人和貨物) 3.struct是值類(lèi)型(Value Type),深拷貝。class是引用類(lèi)型(Reference Type),淺拷貝。
六、Swift optional是什么類(lèi)型的
optional類(lèi)型是一個(gè)枚舉類(lèi)型,有兩個(gè)枚舉值: 1、None類(lèi)型 2、Some(Wrapped) 這兩個(gè)類(lèi)型決定了optional類(lèi)型的概念和含義,有值或者沒(méi)有值: 1)optional.None表示該類(lèi)型沒(méi)有值,也就是nil。(特別聲明,swift中的nil不在有指針含義,而是表示且僅表示optional的.None)。 2)optional.Some(Wrapped)這是表示有值的情況,Some類(lèi)似于java或者c++的泛類(lèi)型的含義,Wrapped 類(lèi)似是封裝的值。
optional的wrap和unwrap
使用optional類(lèi)型,該類(lèi)型會(huì)對(duì)賦值過(guò)程和取值進(jìn)行一些處理。 1)賦值也被稱(chēng)為裝包的過(guò)程(wrap),optional類(lèi)型會(huì)獲取當(dāng)前值的類(lèi)型和具體值,如int類(lèi)型的數(shù)字100.當(dāng)一個(gè)optional類(lèi)型被賦值為這個(gè)值時(shí),其實(shí)optional記錄了對(duì)應(yīng)的類(lèi)型(some)int,和值部分(wrapped)100. 2)取值也被稱(chēng)為解包的過(guò)程(unwrap),optional根據(jù)記錄的類(lèi)型(some)如上面說(shuō)的int,和值部分(wrapped)100,新建一個(gè)some(wrapped)同int(100)返回給程序 optional是swift特別聲明的安全類(lèi)型,在使用過(guò)程中如果處理得當(dāng)?shù)脑?huà)可以防止以前oc上很多因?yàn)閿?shù)據(jù)沒(méi)值導(dǎo)致的crash。個(gè)人還是比較推薦使用的,雖然有時(shí)候有些解包的過(guò)程感覺(jué)特別麻煩,但這都是一道道安全門(mén),阻斷了很多crash的誕生。
七、rxswift中請(qǐng)求重試的方法是哪個(gè)?
1,catchError
enum ObError: Error {
case error1
}
let ob1 = PublishSubject
let ob2 = PublishSubject.of("A", "B")
ob1.catchError { (error) -> Observable
print(error)
return ob2
}.subscribe { event in
print(event)
}.disposed(by: disposeBag)
ob1.onNext("111")
ob1.onError(ObError.error1)
//next(111)
//error1
//next(A)
//next(B)
//completed
2,retry
var isFail = true
let obs = Observable
ob.onNext("成功1")
if isFail {
ob.onError(ObError.error1)
isFail = false
}
ob.onNext("重試成功")
ob.onCompleted()
return Disposables.create()
}
obs.retry(2).subscribe { event in
print(event)
}.disposed(by: disposeBag)
next(成功1)
next(成功1)
next(重試成功)
completed
八、講解一下Swift中的數(shù)據(jù)封裝
封裝主要有兩大目的:一是為了我們使用數(shù)據(jù)更加方便,二是為了數(shù)據(jù)保護(hù)。 1、Swift 訪(fǎng)問(wèn)修飾符 在 Swift 語(yǔ)言中,訪(fǎng)問(wèn)修飾符也分為三類(lèi),分別是 private、internal、public。
Swift 的訪(fǎng)問(wèn)修飾符從 Xcode6 beta4 才開(kāi)始支持。 Swift 對(duì)訪(fǎng)問(wèn)權(quán)限的控制,不是基于類(lèi)的,而是基于文件的。 在 Swift 語(yǔ)言中,若要設(shè)置某一屬性的訪(fǎng)問(wèn)權(quán)限,需在定義屬性時(shí)加上相應(yīng)的修飾前綴。 三類(lèi)修飾符的訪(fǎng)問(wèn)權(quán)限
1)private 所修飾的屬性或者方法只能在當(dāng)前 Swift 源文件里可以訪(fǎng)問(wèn),在別的文件里訪(fǎng)問(wèn)會(huì)出錯(cuò)。
2)internal 是默認(rèn)的訪(fǎng)問(wèn)權(quán)限。所修飾的屬性或者方法在源代碼所在的整個(gè)模塊都可以訪(fǎng)問(wèn)。如果是框架或者是庫(kù)代碼,則在整個(gè)框架內(nèi)部可以訪(fǎng)問(wèn),框架由外部代碼所引用時(shí),則不可訪(fǎng)問(wèn)。如果是 App 代碼,在整個(gè) App 內(nèi)部可以訪(fǎng)問(wèn)。
3)public 所修飾的屬性或者方法對(duì)于引用了該文件或者模塊的文件來(lái)講,都能訪(fǎng)問(wèn)這些屬性和方法。一般來(lái)說(shuō) public 的出現(xiàn)是為了 API 開(kāi)發(fā)而設(shè)置。
Class Person {
private var _weight: Int!
var weight: Int {
get {
return _weight
}
set {
_weight = newValue
}
}
}
您甚至可以將變量設(shè)為公開(kāi)只讀,并設(shè)為私有讀寫(xiě):
class Person {
public private(set) var weight: Int
}
九、Swift異常捕捉的方法有哪些 ?
//
// ViewController.swift
// Throws
//
// Created by fe on 2017/3/7.
// Copyright ? 2017年 fe. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
//如果在調(diào)用系統(tǒng)的方法時(shí),后面有throws則說(shuō)明此方法會(huì)拋出異常,如果方法會(huì)拋出異常,則需要我們處理異常
//創(chuàng)建正則表達(dá)式規(guī)則
let pattern = "abcdefg"
//創(chuàng)建正則表達(dá)式隊(duì)形
/*
在swift中提供三種處理異常的方式
方式一:try方式 程序員手動(dòng)捕捉異常
do { let regex = try NSRegularExpression(pattern: pattern, options:.caseInsensitive)
print(regex)
}catch{
print(error)
}
方式二:try?方式(常用方式) 系統(tǒng)幫助我們處理異常,如果有異常,則該方法返回nil,如果沒(méi)有異常,則該方法返回對(duì)應(yīng)的對(duì)象
guard (try? NSRegularExpression(pattern: pattern, options: .caseInsensitive)) != nil else {
return
}
方式三:try!方式(不建議使用,非常危險(xiǎn))這種方法直接告訴系統(tǒng)沒(méi)有異常,如果有異常則程序會(huì)崩潰
let regex = try! NSRegularExpression(pattern: pattern, options:.caseInsensitive)
*/
}
}
函數(shù)中產(chǎn)生的異常只能在函數(shù)內(nèi)部解決,開(kāi)發(fā)者也可以使用throws關(guān)鍵字將此函數(shù)聲明為可拋異常函數(shù),此類(lèi)聲明則允許開(kāi)發(fā)者在函數(shù)外解決函數(shù)內(nèi)部拋出的異常
** 異常的捕獲與處理
系統(tǒng)為我們提供了三種異常處理的方法:
<1> 使用do-catch結(jié)構(gòu)來(lái)捕獲處理異常、將異常映射為optional值,終止異常傳遞
<2> 使用try?來(lái)調(diào)用函數(shù)可以將異常映射為Optional值
<3> 使用try!來(lái)強(qiáng)制終止異常的傳遞
do-catch:do-catch結(jié)構(gòu)是swift語(yǔ)言中處理異常最常用的方法,開(kāi)發(fā)者需要將可能拋出的異常的代碼放入do結(jié)構(gòu)中,如果這部分代碼中有拋出異常,則會(huì)從catch塊中尋找對(duì)應(yīng)的異常類(lèi)型,如果找到對(duì)應(yīng)的,則會(huì)執(zhí)行此catch塊中的異常處理代碼.
十、map函數(shù)有幾種、分別講解一下?
高階函數(shù)一共有下面幾個(gè):
map:對(duì)給定數(shù)組每一個(gè)元素,執(zhí)行閉包中的映射,將映射結(jié)果放置在數(shù)組中返回。 flatMap:對(duì)給定數(shù)組的每一個(gè)元素,執(zhí)行閉包中的映射,對(duì)映射結(jié)果進(jìn)行合并操做,而后將合并操做后的結(jié)果放置在數(shù)組中返回。 compactMap:對(duì)給定數(shù)組的每一個(gè)元素,執(zhí)行閉包中的映射,將非空的映射結(jié)果放置在數(shù)組中返回。 filter:對(duì)給定數(shù)組的每一個(gè)元素,執(zhí)行閉包中的操做,將符合條件的元素放在數(shù)組中返回。 reduce:對(duì)給定數(shù)組的每一個(gè)元素,執(zhí)行閉包中的操做對(duì)元素進(jìn)行合并,并將合并結(jié)果返回。
柚子快報(bào)邀請(qǐng)碼778899分享:iOS 面試 Swift基礎(chǔ)題
文章來(lái)源
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀(guān)點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。