swift 小知識點匯總

1. class 和 struct 的區(qū)別

class 為類, struct 為結(jié)構(gòu)體, 類是引用類型, 結(jié)構(gòu)體為值類型, 結(jié)構(gòu)體不可以繼承

2.map悲柱、filter、reduce 的作用

map 用于映射, 可以將一個列表轉(zhuǎn)換為另一個列表

[1, 2, 3].map{"\($0)"}// 數(shù)字數(shù)組轉(zhuǎn)換為字符串數(shù)組
//["1", "2", "3"]

filter 用于過濾, 可以篩選出想要的元素

[1, 2, 3].filter{$0 % 2 == 0} // 篩選偶數(shù)
//[2]

reduce 合并

[1, 2, 3].reduce(""){$0 + "\($1)"}// 轉(zhuǎn)換為字符串并拼接
//"123"

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

flatmap 有兩個實現(xiàn)函數(shù)實現(xiàn)

    public func flatMap<ElementOfResult>(_ transform: (Element) throws -> ElementOfResult?) rethrows -> [ElementOfResult] 

這個方法, 中間的函數(shù)返回值為一個可選值, 而 flatmap 會丟掉那些返回值為 nil 的值
例如

//例如
["1", "@", "2", "3", "a"].flatMap{Int($0)}
// [1, 2, 3]
["1", "@", "2", "3", "a"].map{Int($0) ?? -1}
//[Optional(1), nil, Optional(2), Optional(3), nil]

另一個實現(xiàn)
public func flatMap<SegmentOfResult>(_ transform: (Element) throws -> SegmentOfResult) rethrows -> [SegmentOfResult.Iterator.Element] where SegmentOfResult : Sequence
中間的函數(shù), 返回值為一個數(shù)組, 而這個 flapmap 返回的對象則是一個與自己元素類型相同的數(shù)組

func someFunc(_ array:[Int]) -> [Int] {
    return array
}
[[1], [2, 3], [4, 5, 6]].map(someFunc)
//[[1], [2, 3], [4, 5, 6]]
[[1], [2, 3], [4, 5, 6]].flatMap(someFunc)
//[1, 2, 3, 4, 5, 6]

其實這個實現(xiàn), 相當于是在使用 map 之后, 再將各個數(shù)組拼起來一樣的

[[1], [2, 3], [4, 5, 6]].map(someFunc).reduce([Int]()) {$0 + $1}
// [1, 2, 3, 4, 5, 6]

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

file 用于獲取當前文件文件名

line 用于獲取當前行號

column 用于獲取當前列編號

function 用于獲取當前函數(shù)名

var file: String = #file
var line: String = #line
var column: String = #column
var function: String = #function
method: String = #function,
print("\(file)--\(line)--\(columne)--\(function))

5.private挽荠,fileprivate,internal,public 和 open 五種訪問控制的權(quán)限

//1.當private 或fileprivate 修飾屬性的時候
privte 修飾的屬性只能在本類的作用域且在當前文件內(nèi)能訪問
fileprivate 修飾的屬性只能在當前文件內(nèi)訪問到,不管是否在本類作用域

//2. fileprivate 修飾方法的時候
fileprivate 修飾的方法廷粒,類的外部無法調(diào)用
fileprivate 修飾方法窘拯,子類定義的同一個文件中红且,可以訪問
fileprivate 修飾方法坝茎,子類定義不在同一個文件,不可以訪問


//3.public 和 open 的區(qū)別
這兩個都用于在模塊中聲明需要對外界暴露的函數(shù), 區(qū)別在于, public 修飾的類, 在模塊外無法繼承, 而 open 則可以任意繼承, 公開度來說, public < open

6. guard 的使用場景

swift 的語法糖之一

//當(條件) 為false 的時候進入{}
guard 條件
{
        
}

7.if let 語法糖使用場景

swift 中因為有optional暇番,所以需要經(jīng)常判空嗤放,舉例說明if let 解決了什么問題

//不使用if let
func doSometing(str: String?){
    ...
}
let value :String ! = str
if value != ni {
     //如果value 不為 nil進入大括號執(zhí)行
}

//使用了if let 簡潔了很多
func doSometing(str: String?){
     ...
}
if let value = str {
    //如果value 不為 nil進入大括號執(zhí)行
}

8.defer的使用場景

defer 語句塊中的代碼, 會在當前作用域結(jié)束前調(diào)用, 常用場景如異常退出后, 關(guān)閉數(shù)據(jù)庫連接

func someQuery() -> ([Result], [Result]){
    //假如打開數(shù)據(jù)庫失敗        
    let db = DBOpen("xxx")
    defer {
        db.close()
    }
    //或者 查詢失敗導致異常退出 調(diào)用defer,執(zhí)行里面的代碼
    guard results1 = db.query("query1") else {
        return nil
    }
    guard results2 = db.query("query2") else {
        return nil
    }
    return (results1, results2)
}

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

NSString 與 String 之間可以隨意轉(zhuǎn)換

let someString = "123"
let someNSString = NSString(string: "n123")
let strintToNSString = someString as NSString
let nsstringToString = someNSString as String

10.associatedtype 的作用

簡單來說就是 protocol 使用的泛型
例如定義一個列表協(xié)議

protocol ListProtcol {
    associatedtype Element
    func push(_ element:Element)
    func pop(_ element:Element) -> Element?
}

實現(xiàn)協(xié)議的時候, 可以使用 typealias 指定為特定的類型, 也可以自動推斷, 如

class IntList: ListProtcol {
    typealias Element = Int // 使用 typealias 指定為 Int
    var list = [Element]()
    func push(_ element: Element) {
        self.list.append(element)
    }
    func pop(_ element: Element) -> Element? {
        return self.list.popLast()
    }
}
class DoubleList: ListProtcol {
    var list = [Double]()
    func push(_ element: Double) {// 自動推斷
        self.list.append(element)
    }
    func pop(_ element: Double) -> Double? {
        return self.list.popLast()
    }
}

11.關(guān)于泛型的使用

class AnyList<T>: ListProtcol {
    var list = [T]()
    func push(_ element: T) {
        self.list.append(element)
    }
    func pop(_ element: T) -> T? {
        return self.list.popLast()
    }
}

12.可以使用 where 字句限定 Element 類型, 如:

extension ListProtcol where Element == Int {
    func isInt() ->Bool {
        return true
    }
}

13. ?? 的用法

可選值的默認值, 當可選值為nil 的時候, 會返回后面的值. 如

let someValue = optional1 ?? 0

14. lazy 的用法

swift 中的懶加載壁酬,只有被調(diào)用到的時候次酌,才初始化和賦值

class LazyClass {
    lazy var someLazyValue: Int = {
        print("lazy init value")
        return 1
    }()
    var someNormalValue: Int = {
        print("normal init value")
        return 2
    }()
}
let lazyInstance = LazyClass()
print(lazyInstance.someNormalValue)
print(lazyInstance.someLazyValue)

15.swift block循環(huán)引用解決

在其參數(shù)前面使用[weak self]或者[unowned self]

let emtyOb = Observable<String>.empty()
_ = emtyOb.subscribe(onNext: { [weak self] (number) in
    
    print("訂閱:",number)
    self.label.text = number
})

16. dynamic 的用法

由于 swift 是一個靜態(tài)語言, 所以沒有 Objective-C 中的消息發(fā)送這些動態(tài)機制, dynamic 的作用就是讓 swift 代碼也能有 Objective-C 中的動態(tài)機制, 常用的地方就是 KVO 了, 如果要監(jiān)控一個屬性, 則必須要標記為 dynamic, 可以參考文章http://www.reibang.com/p/ae26100b9edf

什么時候使用 @objc
@objc 用途是為了在 Objective-C 和 Swift 混編的時候, 能夠正常調(diào)用 Swift 代碼. 可以用于修飾類, 協(xié)議, 方法, 屬性.
常用的地方是在定義 delegate 協(xié)議中, 會將協(xié)議中的部分方法聲明為可選方法, 需要用到@objc

@objc protocol OptionalProtocol {
    @objc optional func optionalFunc()
    func normalFunc()
}
class OptionProtocolClass: OptionalProtocol {
    func normalFunc() {
    }
}
let someOptionalDelegate: OptionalProtocol = OptionProtocolClass()
someOptionalDelegate.optionalFunc?()

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

一個函數(shù)如果可以以某一個函數(shù)作為參數(shù), 或者是返回值, 那么這個函數(shù)就稱之為高階函數(shù), 如 map, reduce, filter

18. static 和 class 有什么區(qū)別

static 定義的方法不可以被子類繼承, class 則可以

class AnotherClass {
    static func staticMethod(){}
    class func classMethod(){}
}
class ChildOfAnotherClass: AnotherClass {
    override class func classMethod(){}
    //override static func staticMethod(){}// error
}

19.枚舉定義

與OC不一樣,Swift的枚舉擴展性很強了舆乔,OC只能玩Int岳服,swift 支持

整型(Integer)
浮點數(shù)(Float Point)
字符串(String)
布爾類型(Boolean)

enum Movement {
    case letf
    case right
    case top
    case bottom
}
enum Area: String {
    case Dong = "dong"
    case Nan = "nan"
    case Xi = "xi"
    case Bei = "bei"
}

//嵌套枚舉
enum Area {
    enum DongGuan {
        case NanCheng
        case DongCheng
    }
    
    enum GuangZhou {
        case TianHe
        case CheBei
    }
}

//枚舉關(guān)聯(lián)值
enum Trade {
    case Buy(stock:String,amount:Int)
    case Sell(stock:String,amount:Int)
}

let trade = Trade.Buy(stock: "003100", amount: 100)

switch trade {
case .Buy(let stock,let amount):
    
    print("stock:\(stock),amount:\(amount)")
    
case .Sell(let stock,let amount):
    print("stock:\(stock),amount:\(amount)")
default:
    ()
}

20. swift中set 、get 方法

swift 中的set 和 get 要復雜一點希俩。 在swift 中主要分存儲型屬性計算型屬性 這兩種 吊宋, 一般 我們只是給計算屬性添加 get\set 重寫

var command:Int {
    get {
        //return command; 會導致死循環(huán)
        //return self.command; 會導致死循環(huán)
        //return _command; 會導致死循環(huán)
        //且不能像OC那樣 return _command;
        return 1
    }
    set {
        //新值 newValue
        //value 為一個外部屬性變量
        value = newValue
    }
}

//為了解決儲型屬性的set、get 方法問題
var _command:int?
var command :Int {
    get {
       return _command 
    }
    set {
       _command = newValue 
    }
}

21. swift 中 willset 和didset 方法

屬性初始化的時候颜武,willSet 和didSet 不會調(diào)用璃搜,只有在初始化上下文之外,屬性發(fā)生改變的時候調(diào)用鳞上;
給屬性添加觀察者屬性的時候这吻,必須聲明屬性類型,否則編譯會報錯篙议;

var command :Int {
    willSet {
       print("newValue is \(newValue)")
    }
    didSet {
      print("newValue is \(newValue)")
      print("oldValue is \(oldValue)")
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末唾糯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子涡上,更是在濱河造成了極大的恐慌趾断,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吩愧,死亡現(xiàn)場離奇詭異芋酌,居然都是意外死亡,警方通過查閱死者的電腦和手機雁佳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門脐帝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糖权,你說我怎么就攤上這事堵腹。” “怎么了星澳?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵疚顷,是天一觀的道長。 經(jīng)常有香客問我,道長腿堤,這世上最難降的妖魔是什么阀坏? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮笆檀,結(jié)果婚禮上忌堂,老公的妹妹穿的比我還像新娘。我一直安慰自己酗洒,他們只是感情好士修,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著樱衷,像睡著了一般棋嘲。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上矩桂,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天封字,我揣著相機與錄音,去河邊找鬼耍鬓。 笑死阔籽,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的牲蜀。 我是一名探鬼主播笆制,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涣达!你這毒婦竟也來了在辆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤度苔,失蹤者是張志新(化名)和其女友劉穎匆篓,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寇窑,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡鸦概,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了甩骏。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片窗市。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖饮笛,靈堂內(nèi)的尸體忽然破棺而出咨察,到底是詐尸還是另有隱情,我是刑警寧澤福青,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布摄狱,位于F島的核電站脓诡,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏媒役。R本人自食惡果不足惜誉券,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望刊愚。 院中可真熱鬧,春花似錦踩验、人聲如沸鸥诽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽牡借。三九已至,卻和暖如春袭异,著一層夾襖步出監(jiān)牢的瞬間钠龙,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工御铃, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碴里,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓上真,卻偏偏與公主長得像咬腋,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子睡互,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容