swift實戰技巧
給oc呼叫的方法需要新增@objc
標記,一般的action-target的處理方法,通知的處理方法等需要新增@objc標記
@objc func onrefresh()
使用方法型如 #selector(方法名稱)
eg.
`#selector(self.onrefresh))`
更加詳細的介紹可以看這篇文章:
下面是使用mjrefresh給mj_header
和mj_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()
,方法可以使用sync
,async
,asyncafter
等等
下面是網路請求執行緒間呼叫的例子
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操作容器,會有重複寫的問...