Swift實戰技巧

2022-02-18 00:42:41 字數 3930 閱讀 2396

swift實戰技巧

給oc呼叫的方法需要新增@objc標記,一般的action-target的處理方法,通知的處理方法等需要新增@objc標記

@objc func onrefresh()
使用方法型如 #selector(方法名稱)

eg.

`#selector(self.onrefresh))`
更加詳細的介紹可以看這篇文章: 

下面是使用mjrefresh給mj_headermj_footer新增**處理函式的例子

self.mj_header.setrefreshingtarget(self, refreshingaction: #selector(self.onrefresh))

self.mj_footer.setrefreshingtarget(self, refreshingaction: #selector(self.onloadmore))

可能發生異常的方法使用try?方法進行可選捕獲異常

let jsonstr=try?string(contentsoffile: jsonpath!)
anyclass作為方法的形參,類名稱.self(modelclass.self)作為實參

func registercellnib(nib:uinib,modelclass:anyclass)

...self.tableview?.registercellnib(nib: r.nib.gamecell(), modelclass: gamemodel.self)

主線程使用dispatchqueue.main,全域性的子執行緒使用dispatchqueue.global(),方法可以使用syncasyncasyncafter等等

下面是網路請求執行緒間呼叫的例子

let _  = urlsession.shared.datatask(with: url, completionhandler: 

if error == nil else }}

}}).resume()

urlsession.shared.datatask(with: requesturl) 

weakself.tableview.reloaddata()

}

// 模擬網路請求,completion閉包是非同步延遲處理的,所以需要新增`@escaping`進行修飾

class func fetchvideos(completion: @escaping (([video]) -> void)) )

}}

swift3中notification的名字是一種特殊的notification.name型別,下面使用enum進行封裝處理,並且建立乙個notificationcenter的擴充套件,處理通知訊息的傳送

// 定義notification.name列舉

enum ytnotification: string

// 列舉成員返回對應的notification.name型別

var notificationname: nsnotification.name

}extension notificationcenter

}

使用方法

新增通知觀察者使用的是ytnotification列舉成員的notificationname返回的notification.name型別的值

傳送訊息使用的是ytnotification列舉成員

// 新增通知觀察

notificationcenter.default.addobserver(self, selector: #selector(self.changetitle(notification:)), name: ytnotification.scrollmenu.notificationname, object: nil)

// 傳送訊息

notificationcenter.default.yt_post(custom: ytnotification.scrollmenu, object: nil, userinfo: ["length": scrollindex])

lazy惰性載入屬性,只有在使用的時候才初始化變數

// 閉包的方式

let menutitles = ["history", "my videos", "notifications", "watch later"]

lazy var menuitems : [menuitem] =

return tmenuitems

}()// 普通方式,

lazy var titles = ["a", "b"]

使用is判斷型別以及使用if-let和as?判斷型別

// mark:- 型別檢查例子

let sa = [

chemistry(physics: "固體物理", equations: "赫茲"),

maths(physics: "流體動力學", formulae: "千兆赫"),

chemistry(physics: "熱物理學", equations: "分貝"),

maths(physics: "天體物理學", formulae: "兆赫"),

maths(physics: "微分方程", formulae: "余弦級數")]

var chemcount = 0

var mathscount = 0

for item in sa else if item is maths

}// 使用if-let和as?判斷型別

for item in sa else if let _ = item as? maths

}

使用switch-case和as判斷型別

// any可以表示任何型別,包括方法型別

var exampleany = [any]()

// 使用switch-case和as判斷型別

for item2 in exampleany

}

class feed: nsobject, handyjson  

}

oc

swift

cgrectgetmaxx(frame)

frame.maxx

cgrectgetminy(frame)

frame.miny

cgrectgetmidx(frame)

frame.midx

cgrectgetwidth(frame)

frame.width

cgrectgetheight(frame)

frame.height

cgrectcontainspoint(frame, point)

frame.contains(point)

詳細的介紹可以檢視這篇文章:

func composeattrstr(text: string) -> nsattributedstring 

// ...

}

/// imageviewer和imagecell互動使用的協議

protocol ytimagecellprotocol : class

Android實戰技巧 ViewStub的應用

在開發應用程式的時候,經常會遇到這樣的情況,會在執行時動態根據條件來決定顯示哪個view或某個布局。那麼最通常的想法就是把可能用到的view都寫在上面,先把它們的可見性都設為view.gone 然後在 中動態的更改它的可見性。這樣的做法的優點是邏輯簡單而且控制起來比較靈活。但是它的缺點就是,耗費資源...

Android實戰技巧 ViewStub的應用

在開發應用程式的時候,經常會遇到這樣的情況,會在執行時動態根據條件來決定顯示哪個view或某個布局。那麼最通常的想法就是把可能用到的view都寫在上面,先把它們的可見性都設為view.gone 然後在 中動態的更改它的可見性。這樣的做法的優點是邏輯簡單而且控制起來比較靈活。但是它的缺點就是,耗費資源...

docker(4)實戰技巧

資料卷 是乙個可供乙個或多個容器使用的特殊目錄,它繞過 ufs,可以提供很多有用的特性 注意 資料卷 的使用,類似於 linux 下對目錄或檔案進行 mount,映象中的被指定為掛載點的目錄中的檔案會隱藏掉,能顯示看的是掛載的 資料卷。解讀容器中的資料不會儲存 預設通過ufs操作容器,會有重複寫的問...