swift 4 使用小結(與OC差異比較大的寫法)
1. 懶載入
lazy var imageView:UIImageView = {
let imageView = UIImageView()
imageView.image = UIImage.init(named: "big_image")
return imageView
}()
2. 按鈕的點選事件
lazy var button:UIButton = {
let button = UIButton()
button.setTitleColor(UIColor.red, for : .normal)
button.backgroundColor = UIColor.white
button.layer.cornerRadius = 2.0
button.layer.masksToBounds = true
button.isHidden = true
button.addTarget(self, action: #selector(buttonClick(_ :)), for: .touchUpInside)
return button
}()
@objc func buttonClick(_ button :UIButton) -> () {
}
3. 協議可選與必選,delegate是否實現協議
- 必選協議
protocol ImageViewDelegate: class {
func selectedImage() -> ()
func removeImage(_ index: Int) -> ()
}
- 可選協議
@objc protocol ImageCellDelegate: NSObjectProtocol {
@objc optional func imageCelllLikeButtonClick(imageCell: ImageCell, commentId: String, userLiked:Bool) -> ()
@objc optional func imageCellDetalButtonClick(imageCell: ImageCell, content:String) -> ()
}
- 代理
weak var delegate:ImageCellDelegate?
注意:
代理繼承的父類 class和NSObjectProtocol 的區別
代理繼承的父類NSObjectProtocol的時候,判斷代理是否實現某個方法responds(to: #selector()能提示處理,繼承自class則沒法判斷
ImageCellDelegate.實現的方法去判斷!!!
- 代理是否實現了某個協議
@objc func buttonClick(_ button:UIButton) -> () {
guard let delegate = delegate else { return }
if delegate.responds(to: #selector(ImageCellDelegate.imageCellButtonClick(imageCell:content:))) {
delegate.imageCellButtonClick!(imageCell: self, content: commentLabel.text)
}
}
4. 判斷是某個類或某個類及其子類
//判斷某個類
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.isMember(of: tableView.classForCoder) {
view.endEditing(true)
}
}
//判斷某個類及其子類
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if scrollView.isKind(of: tableView.classForCoder) {
view.endEditing(true)
}
}
5. tableView的重新整理
//重新整理所有
self.tableView.reloadData()
//重新整理分組
self.tableView.reloadSections([1], with: .none)
//重新整理某一個cell或者幾個cell
self.tableView.reloadRows(at: [indexPath], with: .none)
6. 正則匹配特定的圖片連結
class func getTopicContentImageUrlLink(_ range: NSRange, _ pattern: String = "<img src=\"(.*?)\">", _ content: String) -> [URL] {
var imageUrlArr: [URL] = []
//利用正則匹配
let pattern = pattern
guard let regularExpression = try? NSRegularExpression.init(pattern: pattern, options: .dotMatchesLineSeparators) else { return []}
let regularResults = regularExpression.matches(in: content, options: [], range: NSMakeRange(0, content.count))
for textCheckingResult in regularResults {
//查詢到的範圍數量
// 0: 和匹配方案完全一致的字串
// 1: ()中需要匹配的字串
for idx in 0..<textCheckingResult.numberOfRanges {
let range = textCheckingResult.rangeAt(idx)
let subStr = (content as NSString).substring(with: range)
let url = URL(string: subStr)
if idx == 1 && url != nil {
imageUrlArr.append(url!)
}
}
}
return imageUrlArr
}
7. swift中NSString的UTF-8轉碼
let content = (newString as NSString).addingPercentEscapes(using: String.Encoding.utf8.rawValue)!
8. GCD通訊與延遲操作
//執行緒通訊
DispatchQueue.global().async {
//do async something
DispatchQueue.main.async {
//main thread do UI update
}
}
//延遲操作 DispatchTime 的精度是納秒
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 10) {
}
DispatchQueue.global().asyncAfter(deadline: DispatchTime.now() + 10) {
}
//DispatchWallTime 的精度是微秒
DispatchQueue.global().asyncAfter(wallDeadline: DispatchWallTime.now() + 2.0) {
}
9. 陣列中取子陣列
let arr = [1,2,3,4,5]
//是個切片陣列和陣列之間可以轉化
let arrSlice = arr[0..<3]
let subArr = Array(arrSlice)
10. 通知
//通知名稱
let ZQPCouponCellSelectedCoupon: Notification.Name = Notification.Name(rawValue: "ZQPCouponCellSelectedCoupon")
//發通知
NotificationCenter.default.post(name: ZQPCouponCellSelectedCoupon, object: couponModel)
//接通知
NotificationCenter.default.addObserver(self, selector: #selector(selectedCoupon(_ :)), name: ZQPCouponCellSelectedCoupon, object: nil)
//響應事件
@objc func selectedCoupon(_ notication: Notification) {
let couponModel = notication.object as! ZQPPlanPlayRedEnvelopeModel
}
11. 時間與時間戳
//當前時間---毫秒級 時間戳 - 13位
let timeInterval: TimeInterval = Date().timeIntervalSince1970
let currentMillisecond = CLongLong(round(timeInterval*1000))
print(currentMillisecond)
`1532068608613`
//當前時間---秒級 時間戳 - 10位
let timeInterval: TimeInterval = Date().timeIntervalSince1970
let currentSecond = Int(timeInterval)
print(currentSecond)
`1532068723`
12. 純swift專案使用YYModel轉模型問題
屬性前[email protected],否則字典轉模型不成功
class PersonModel: NSObject {
//姓名
@objc var name: String?
//年齡
@objc var age: Int = 0
}
13. 單例
static let sharedInstance = ZYManagerController()
14. 訪問庫的差別
//OC
#import <uikit/UIGestureRecognizerSubclass.h>
//Swift
import UIKit.UIGestureRecognizerSubclass
15. 字串對映類
//注意,確保string有值,否則每一步轉換,都要guard防衛
let childrenControllerString: String = item[RootVcName] as! String
let nameSpace = Bundle.main.infoDictionary!["CFBundleExecutable"] as! String
let childrenControllerClass = NSClassFromString(nameSpace + "." + childrenControllerString)
let childrenControllerType = childrenControllerClass as! UIViewController.Type
let childrenController = childrenControllerType.init()
相關推薦
swift 4 使用小結(與OC差異比較大的寫法)
1. 懶載入 lazy var imageView:UIImageView = { let imageView = UIImageView() im
MySQL與Oracle 差異比較-基本語法
1、 查詢行數自增1 Oracle:中select rownum , a.* from fdcom a Mysql: select @ROWNO := @ROWNO + 1 as rownum , a.* from (select shortname from
利用PHP腳本輔助MySQL數據庫管理4-兩個庫表結構差異比較
for mysql ase array 表結構差異 [] 結構 _array 輔助 <?php define(‘DATABASE1‘, ‘coffeetest‘); $dbi1 = new DbMysql; $dbi1->dbh = ‘mysql://
MySQL與Oracle SQL語言差異比較
Oracle與MySQL的SQL語句區別 1資料庫 /* mysql可以建立資料庫,而oracle沒有這個操作,oracle只能建立例項; sql資料庫操作:database 格式: &nbs
布隆過濾器與 Swift 4.2
作者:Soroush Khanlou,原文連結,原文日期:2018-09-19 譯者:WAMaker;校對:numbbbbb,小鐵匠Linus;定稿:Forelax Swift 4.2 為雜湊的實現帶來了一些新的變化。在此之前,雜湊交由物件本身全權代理。當你向物件索取 雜湊值(hashValue)
大資料,springcloud 的 Eureka與ZooKeeper 的比較
Eureka與ZooKeeper 的比較(轉) 原文https://www.cnblogs.com/zgghb/p/6515062.html Eureka的優勢 1、在Eureka平臺中,如果某臺伺服器宕
oc與swift混編,OC呼叫swift,swift呼叫OC
1、oc工程呼叫swift-----自動建立橋接標頭檔案 建立一個oc工程: 設定Product Module Name = 工程名 建立一個swift檔案: 點選自動建立橋接標頭檔案: 設定Objective-C Bridging Header 如下圖:
ASP.NET C# 不同瀏覽器在 buffer 緩衝區 與Response.Flush() 表現差異比較 « 關於網路那些事...
ASP.NET C# 不同瀏覽器在 buffer 緩衝區 與Response.Flush() 表現差異比較 ASP 輸出內容到網頁的方式基本上有兩種 直接輸出 緩
apache2.4版本與2.2版本的差異
1、在2.2版本中eventMPM還處於測試階段,而2.4版本event已經可以正常使用了 2、2.4版本的3個MPM工作模式使用的是DSO動態模組來實現的,而2.2則是直接編譯成了靜態模組 3、2.4版本切換MPM工作模式是在/etc/httpd/conf
PDM與ERP的差異比較說明
近年來,在企業資訊化過程中,作為幫助企業提高生產效率的企業資源規劃(ERP)和產品資料管理(PDM)這兩種工程軟體使用愈來愈廣泛,但如何正確地部署它們卻並非每家企業都明白。要正確地利用這兩類軟體,弄清其異同是關鍵。 PDM系統出現於如世紀80年代,
一張圖解讀工業4.0與物聯網,雲端計算和大資料的關係
網際網路新概念層出不窮,在雲端計算,物聯網,大資料火熱之後,工業4.0在2014年受到越來越多的關注,在2015年成為新的熱點之前,我們有必要了解這個新概念究竟是什麼含義,它和其他網際網路概念間到底是什麼關係。 2013年4月,德國政府在2013年4月的漢諾威工業博覽會上正式推出提出“
Swift開發指南:使用Swift與Cocoa和Objective-C(Swift 4)
與Objective-C API進行互動 互操作性是能夠在任何一個方向上與Swift和Objective-C進行介面,讓您訪問並使用以其他語言的檔案中的一些程式碼。當您開始將Swift整合到應用程式開發工作流程中時,瞭解如何利用互操作性來重新定義、改進和增
Swift與OC中拷貝與可變性總結
為了解釋方便,定義兩個類:Person和MyObject,它們都繼承自NSObject。他們的關係如下: // Person.h @property (strong, nonatomic, nullable) MyObject *object; // MyObjec.h @property (copy,
iOS8開發~Swift(五)Swift與OC混編
一、概要 首先看《The Swift Programming Language》中提到“Swift’s compatibility with Objective-C lets you create a project that contains files written
iOS開發之swift與OC混編出現的坑,oc中不能對swift的代理進行呼叫,不能訪問swift中的代理,swift中的回撥方法
1. swift與oc混編譯具體怎麼實現,這兒我就不重複講出了,網上有大把的人講解。 2. 在swift與OC混編的編譯環境下, oc類不能訪問swift建立類中的代理? 解決方法如下: 在代理的頭部加上 @objc(代理名字),這樣就在外部就可以訪問了,如下圖。 然
swift與OC之間不得不知道的21點
swfit和OC間的 聯絡 1.swift句尾不需要分號 ,除非你想在一行中寫三行程式碼就加分號隔開。 2.swift不要寫main函式 ,程式預設從上往下執行 3.swift不分.h和.m檔案 ,一個類只有.swift一個檔案 4.swift不在有地址的概
swift與OC混編(建立混編工程)
原創文章轉載請註明出處。 背景 Swift語言自推出以來蘋果官方就開始努力開始推這門新語言。就在15年WWDC上更是把Swift進行了開源,瞬間star就開始不斷飆升,截止今天(16年1月25)已經達到26059個star【原始碼請點選這裡】
PMBOK(第4版)--專案管理九大知識領域的【輸入】、【工具與技術】、【輸出】一覽表
專案管理的九大知識領域 領域 概述 輸入 工具與技術 輸出 專案整合管理 4.1 制定專案章程 1 專案工作說明書 1 專家判斷 1 專案章程 2 商業論證 3 合同 4 事業環境因素 5 組織過程
《演算法筆記》4. 堆與堆排序、比較器詳解
[TOC] # 比較器與堆 ## 堆結構 ### 完全二叉樹結構 > 完全二叉樹結構:要麼本層是滿的,要麼先滿左邊的,以下都是完全二叉樹 1. ``` graph TD A-->B A-->C ``` 2. ``` graph TD A-->B A-->C B--&
設計模式—靜態代理模式(聚合與繼承方式比較)
rri 技術分享 ktr sta too div ide rup 增加 一、概述 1.目標:要在Tank的move()方法做時間代理及日誌代理(可以設想以後還要增加很多代理處理),且代理間的順序可活更換 2.思路: (1)聚合:代理類聚合了被代理類,且代理類及被代理類都實現