Swift小技巧(五)

1.利用謂語語法和正則表達式,判斷字符串是否符合特定格式

//利用謂語語法悔捶,判斷一個字符串是否是郵箱峻黍。
func isValidEmail(testStr: String) -> Bool {
    //可以根據(jù)自己的需要改成別的正則表達式
    let emailRegex = "[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}"
    let emailTest = NSPredicate(format: "SELF MATCHES %@", emailRegex)
    return emailTest.evaluate(with: testStr)
}
isValidEmail(testStr: "213@12.com")//true

2.如何判斷app運行在真機還是模擬器上面

#if (arch(i386) || arch(x86_64)) && os(iOS)
    //如果是模擬器流昏,則會運行精盅,真機上面則不會執(zhí)行
    print("模擬器")
#endif
    print("正常代碼")

3.OC中的 | 在,swift中如何使用

//oc中溯祸,|的使用,如下所示
let view = UIView(frame: CGRect(x: 0, y: 0, width: 320, height: 568))
addSubview(view)
view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
//而在swift中舞肆,應該這樣使用
view.autoresizingMask = [.flexibleWidth, .flexibleHeight]

4.用什么方法實現(xiàn)OC的respondsToSelector方法

//使用如下方式代替
if let delegate = delegate {//判斷是否存在代理
    if let theMethod = delegate.theOptionalProtocolMethod? {//判斷代理是否實現(xiàn)方法
        theMethod()
        return
    }
}

5.如何將路徑等轉換編碼方式

let originalString = "test/test"
//.urlHostAllowed可以換成需要的轉換類型
var escapedString = originalString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)
print(escapedString)//Optional("test%2Ftest")

6.如何快速的獲得某個date的年月日時分秒等

let date = Date()
//獲得當天的日歷對象
let calendar = Calendar.current
//獲得小時
let hour = calendar.component(.hour, from: date)
//獲得分鐘
let minutes = calendar.component(.minute, from: date)

7.如何給UITextView添加placeholder占位符

//定義了一個全局的常量
let placeholderText = "請輸入內(nèi)容焦辅!"
//1.給textview擴展如下方法:
extension UITextView {
    func addPlaceholderText(text: String) {
        self.text = text
        self.textColor = .lightGray
    }
}
//2.創(chuàng)建出textview
        textView = UITextView(frame: view.frame)
        textView.delegate = self
        textView.addPlaceholderText(text: placeholderText)
        view.addSubview(textView)
//3.在textview的下列代理方法中,實現(xiàn)如下兩個方法椿胯,添加如下代碼
    func textViewDidBeginEditing(_ textView: UITextView) {
        if textView.textColor == .lightGray {
            textView.text = nil
            textView.textColor = .black
        }
    }
    
    func textViewDidEndEditing(_ textView: UITextView) {
        if textView.text.isEmpty {
            textView.addPlaceholderText(text: placeholderText)
        }
    }

只需要以上操作筷登,textview就可以跟textfield一樣,擁有一個placeholder占位符提示語

8.格式化輸出Int

三種方式

//方法一:
let str = String(format: "%02d-%03d", 1,2)//01-002

//方法二
let str2 = String(format: "%02d-%03d", arguments: [1,2])//01-002

//方法三
let formatter = NumberFormatter()
formatter.minimumIntegerDigits = 2
let str3 = formatter.string(from: 1)//01

9.獲得字典的key數(shù)組

let dict = ["a":1,"b":2]
let keys = Array(dict.keys)
keys.map { print($0) }//打印key

//如果是nsdictionary哩盲,使用alleys即可
let keys = dict.allKeys

10.搜索指定的文件夾路勁

let documentsPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]

11.獲得app設置中version版本號

比如在設置中前方,我們設置的如圖:

屏幕快照 2017-05-08 下午2.56.42.png
let verson = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String
print(version)//1.0.1

12.設置tableview的分割線separator的顏色,寬度等

        tableView.separatorColor = .red//分割線顏色
        tableView.separatorStyle = .singleLineEtched//分割線樣式
//        tableView.separatorEffect//效果
        tableView.separatorInset = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)//分割線內(nèi)邊距廉油,都設置為0惠险,則會出現(xiàn)一條寬等于屏幕的完整的分割線

13.如何安全的使用array,如果下標越界等情況發(fā)生時抒线,不會崩潰

//給collection擴展一個下標方法
extension Collection where Indices.Iterator.Element == Index {
    subscript (safe index: Index) -> Generator.Element? {
        return indices.contains(index) ? self[index] : nil
    }
}
//使用
let arr = [1]
arr[safe: 2]//nil莺匠,會得到一個nil,而不會崩潰

14.如何使用iOS自帶的tableview刷新控件

//創(chuàng)建出刷新控件
        let refreshControl = UIRefreshControl()
        refreshControl.attributedTitle = NSAttributedString(string: "開始刷新")
        refreshControl.addTarget(self, action: #selector(refresh(sender:)), for: .valueChanged)
        //添加上去即可
        tableView.addSubview(refreshControl)

//實現(xiàn)刷新函數(shù)
    func refresh(sender: AnyObject) {
        //做刷新要做的事情
        print("開始刷新")
    }
        
        //結束刷新十兢,需要結束的時候調(diào)用
        refreshControl.endRefreshing()

15.如何快速實現(xiàn)趣竣,鍵盤彈起,view跟著上移旱物,鍵盤消失遥缕,恢復原位

//添加一個監(jiān)聽,監(jiān)聽鍵盤的彈起
   NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
//監(jiān)聽鍵盤的消失
   NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
//上移頁面
func keyboardWillShow(sender: NSNotification) {
     self.view.frame.origin.y = -150 // Move view 150 points upward 
}
//恢復
func keyboardWillHide(sender: NSNotification) {
     self.view.frame.origin.y = 0 // Move view to original position  
}

16.如何獲得一個view的快照宵呛,并生成image

extension UIView {
    func takeSnapshot() -> UIImage {
        UIGraphicsBeginImageContextWithOptions(bounds.size, false, UIScreen.main.scale)
        drawHierarchy(in: self.bounds, afterScreenUpdates: true)
        let image = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
        return image
    }
}

17.如何設置導航條背景单匣、字體顏色,tabbar背景宝穗、字體顏色

//Navigation Bar:
navigationController?.navigationBar.barTintColor = UIColor.green
//Navigation Bar Text:
navigationController?.navigationBar.titleTextAttributes = [NSForegroundColorAttributeName: UIColor.orange]
//Tab Bar:
tabBarController?.tabBar.barTintColor = UIColor.brown
//Tab Bar Text:
tabBarController?.tabBar.tintColor = UIColor.yellow

18.如何刪除array已知元素

//擴展一個方法
extension Array where Element: Equatable {
    //刪除匹配到的第一個元素
    mutating func remove(object: Element) {
        if let index = index(of: object) {
            remove(at: index)
        }
    }
}

19.快速比較户秤,兩個date之間的差距,比如相差多少年月日等

extension Date {
    //返回相差多少年
    func years(from date: Date) -> Int {
        return Calendar.current.dateComponents([.year], from: date, to: self).year ?? 0
    }
    //返回差多少月
    func months(from date: Date) -> Int {
        return Calendar.current.dateComponents([.month], from: date, to: self).month ?? 0
    }
    //返回差多少周
    func weeks(from date: Date) -> Int {
        return Calendar.current.dateComponents([.weekOfMonth], from: date, to: self).weekOfMonth ?? 0
    }
    //返回差多少天
    func days(from date: Date) -> Int {
        return Calendar.current.dateComponents([.day], from: date, to: self).day ?? 0
    }
    //返回差多少小時
    func hours(from date: Date) -> Int {
        return Calendar.current.dateComponents([.hour], from: date, to: self).hour ?? 0
    }
    //返回差多少分鐘
    func minutes(from date: Date) -> Int {
        return Calendar.current.dateComponents([.minute], from: date, to: self).minute ?? 0
    }
    //返回差多少秒
    func seconds(from date: Date) -> Int {
        return Calendar.current.dateComponents([.second], from: date, to: self).second ?? 0
    }
    //返回差距的描述
    func offset(from date: Date) -> String {
        if years(from: date)   > 0 { return "\(years(from: date))y"   }
        if months(from: date)  > 0 { return "\(months(from: date))M"  }
        if weeks(from: date)   > 0 { return "\(weeks(from: date))w"   }
        if days(from: date)    > 0 { return "\(days(from: date))d"    }
        if hours(from: date)   > 0 { return "\(hours(from: date))h"   }
        if minutes(from: date) > 0 { return "\(minutes(from: date))m" }
        if seconds(from: date) > 0 { return "\(seconds(from: date))s" }
        return ""
    }
}
//使用
let date1 = DateComponents(calendar: .current, year: 2014, month: 11, day: 28, hour: 5, minute: 9).date!
let date2 = DateComponents(calendar: .current, year: 2015, month: 8, day: 28, hour: 5, minute: 9).date!

let years = date2.years(from: date1)     // 0
let months = date2.months(from: date1)   // 9
let weeks = date2.weeks(from: date1)     // 39
let days = date2.days(from: date1)       // 273
let hours = date2.hours(from: date1)     // 6,553
let minutes = date2.minutes(from: date1) // 393,180
let seconds = date2.seconds(from: date1) // 23,590,800

let timeOffset = date2.offset(from: date1) // "9M"

let date3 = DateComponents(calendar: .current, year: 2014, month: 11, day: 28, hour: 5, minute: 9).date!
let date4 = DateComponents(calendar: .current, year: 2015, month: 11, day: 28, hour: 5, minute: 9).date!

let timeOffset2 = date4.offset(from: date3) // "1y"

let date5 = DateComponents(calendar: .current, year: 2017, month: 4, day: 28).date!
let now = Date()
let timeOffset3 = now.offset(from: date5) // "1w"

//或者使用date components formatter
let dateComponentsFormatter = DateComponentsFormatter()
dateComponentsFormatter.allowedUnits = [.year,.month,.weekOfYear,.day,.hour,.minute,.second]
dateComponentsFormatter.maximumUnitCount = 1
dateComponentsFormatter.unitsStyle = .full
dateComponentsFormatter.string(from: Date(), to: Date(timeIntervalSinceNow: 4000000))  // "1 month"
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末逮矛,一起剝皮案震驚了整個濱河市报慕,隨后出現(xiàn)的幾起案子杏愤,更是在濱河造成了極大的恐慌,老刑警劉巖执隧,帶你破解...
    沈念sama閱讀 212,599評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,629評論 3 385
  • 文/潘曉璐 我一進店門姓赤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人仲吏,你說我怎么就攤上這事不铆。” “怎么了裹唆?”我有些...
    開封第一講書人閱讀 158,084評論 0 348
  • 文/不壞的土叔 我叫張陵狂男,是天一觀的道長。 經(jīng)常有香客問我品腹,道長岖食,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,708評論 1 284
  • 正文 為了忘掉前任舞吭,我火速辦了婚禮泡垃,結果婚禮上,老公的妹妹穿的比我還像新娘羡鸥。我一直安慰自己蔑穴,他們只是感情好,可當我...
    茶點故事閱讀 65,813評論 6 386
  • 文/花漫 我一把揭開白布惧浴。 她就那樣靜靜地躺著存和,像睡著了一般。 火紅的嫁衣襯著肌膚如雪衷旅。 梳的紋絲不亂的頭發(fā)上捐腿,一...
    開封第一講書人閱讀 50,021評論 1 291
  • 那天,我揣著相機與錄音柿顶,去河邊找鬼茄袖。 笑死,一個胖子當著我的面吹牛嘁锯,可吹牛的內(nèi)容都是我干的宪祥。 我是一名探鬼主播,決...
    沈念sama閱讀 39,120評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼家乘,長吁一口氣:“原來是場噩夢啊……” “哼蝗羊!你這毒婦竟也來了?” 一聲冷哼從身側響起仁锯,我...
    開封第一講書人閱讀 37,866評論 0 268
  • 序言:老撾萬榮一對情侶失蹤耀找,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后扑馁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涯呻,經(jīng)...
    沈念sama閱讀 44,308評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,633評論 2 327
  • 正文 我和宋清朗相戀三年腻要,在試婚紗的時候發(fā)現(xiàn)自己被綠了复罐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,768評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡雄家,死狀恐怖效诅,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趟济,我是刑警寧澤乱投,帶...
    沈念sama閱讀 34,461評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站顷编,受9級特大地震影響戚炫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜媳纬,卻給世界環(huán)境...
    茶點故事閱讀 40,094評論 3 317
  • 文/蒙蒙 一双肤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧钮惠,春花似錦茅糜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,850評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至预明,卻和暖如春缩赛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背撰糠。 一陣腳步聲響...
    開封第一講書人閱讀 32,082評論 1 267
  • 我被黑心中介騙來泰國打工峦筒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窗慎。 一個月前我還...
    沈念sama閱讀 46,571評論 2 362
  • 正文 我出身青樓物喷,卻偏偏與公主長得像,于是被迫代替她去往敵國和親遮斥。 傳聞我的和親對象是個殘疾皇子峦失,可洞房花燭夜當晚...
    茶點故事閱讀 43,666評論 2 350

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