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