Swift常用方法總結(jié)----不定期更新

1.本地讀取json文件

    func readJsonFileByFileName(fileName : String) -> Any? {
        
        let path    = Bundle.main.path(forResource: "\(fileName).json", ofType: nil)
        let data    = NSData(contentsOfFile: path!)
        let jsonStr = try? JSONSerialization.jsonObject(with: data! as Data, options:.allowFragments)
        return jsonStr
    }

2.實(shí)現(xiàn)手機(jī)號(hào)銀行卡號(hào)輸入加空格

eg:188 8888 8888


func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        
        let oldStr = textField.text
        var newStr = (oldStr as NSString?)?.replacingCharacters(in: range, with: string)
        if textField.placeholder == "請(qǐng)輸入銀行預(yù)留手機(jī)號(hào)" {
            
            newStr = newStr?.replacingOccurrences(of: " ", with: "")
            
            let expression = "^([1]{1}([34578]{1}([0-9]{0,9}+)?)?)?$"
            let regex = try?NSRegularExpression.init(pattern: expression, options: .caseInsensitive)
            let numOfMatches = regex?.matches(in: newStr!, options: NSRegularExpression.MatchingOptions(rawValue: 0), range: NSMakeRange(0, (newStr?.characters.count)!))
            
            if numOfMatches?.count == 0 {
                
                return false
            }
            
            _ = self.formatPhoneNumText(textField: textField, range: range, string: string)
            
            return false
        }
        else if textField.placeholder == "請(qǐng)輸入銀行卡號(hào)"{
        
            
            // 只能輸入數(shù)字
            let characterSet = NSCharacterSet.init(charactersIn: "0123456789")
            
            let tempString = string.replacingOccurrences(of: " ", with: "")
            if (tempString.rangeOfCharacter(from: characterSet.inverted) != nil) {
                
                return false
            }
            
            var text = ((oldStr as NSString?)?.replacingCharacters(in: range, with: string))!
            text = text.replacingOccurrences(of: " ", with: "")
            
            var newString = ""
            
            while (text.characters.count) > 0 {
                
                let subString = (text as NSString).substring(to: min(text.characters.count, 4))
                newString = newString.appending(subString)
                if subString.characters.count == 4 {
                    
                    newString = newString.appending(" ")
                }
                text = (text as NSString).substring(from: min(text.characters.count, 4))
            }
            newString = newString.trimmingCharacters(in: characterSet.inverted)
            
            if newString.characters.count >= 24 {
                
                return false
            }
            
            if range.location != textField.text?.characters.count {
                
                textField.text = newString
                
                return false
            }
            
            textField.text = newString
            
         
            return false
            
            
            
        }else {
            // 只能輸入數(shù)字
            let characterSet = NSCharacterSet.init(charactersIn: "0123456789")
            
            let tempString = string.replacingOccurrences(of: " ", with: "")
            if (tempString.rangeOfCharacter(from: characterSet.inverted) != nil) {
                
                return false
            }
            if (newStr?.characters.count)! > 20 {
                
                return false
            }
        }
        
        return true
    }

private func formatPhoneNumText (textField:UITextField, range:NSRange, string:String) -> Bool {
        
        var text = textField.text!
        
        // 只能輸入數(shù)字
        let characterSet = NSCharacterSet.init(charactersIn: "0123456789")
        
        let tempString = string.replacingOccurrences(of: " ", with: "")
        if (tempString.rangeOfCharacter(from: characterSet.inverted) != nil) {
            
            return false
        }
        
        text = ((text as NSString?)?.replacingCharacters(in: range, with: string))!
        text = text.replacingOccurrences(of: " ", with: "")
        
        text.insert(" ", at: (text.startIndex))
        var newString = ""
        
        while (text.characters.count) > 0 {
            
            let subString = (text as NSString).substring(to: min(text.characters.count, 4))
            newString = newString.appending(subString)
            if subString.characters.count == 4 {
                
                newString = newString.appending(" ")
            }
            text = (text as NSString).substring(from: min(text.characters.count, 4))
        }
        newString = newString.trimmingCharacters(in: characterSet.inverted)
        
        if newString.characters.count >= 14 {
            
            return false
        }
        
        
        if range.location != textField.text?.characters.count {
            
            textField.text = newString
            
            if textField == self.phoneTextField {
                
            }
            
            return false
        }
        
        textField.text = newString
        
        if textField == self.phoneTextField {
            
        }
        return false
    }

3.給UITextField的placeholder設(shè)置字體大小

使用:textField.verticalLeftPlaceholder(phFontSize: 15)

源碼:
extension UITextField {
    
    func verticalLeftPlaceholder(phFontSize size: CGFloat = 15, text: String = "")  {
        
        var placeholderStr = text
        
        if text.isEmpty {
            
            placeholderStr = self.placeholder ?? ""
        }
        
        let pStyle = NSMutableParagraphStyle()
        pStyle.minimumLineHeight    = (self.font?.lineHeight)! - ((self.font?.lineHeight)! - UIFont.systemFont(ofSize: size).lineHeight)/2.0
        let aString = NSAttributedString(string: placeholderStr, attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: size), NSParagraphStyleAttributeName: pStyle])
        
        self.attributedPlaceholder    = aString
    }
    
}

4.插入排序

⒈ 從第一個(gè)元素開始,該元素可以認(rèn)為已經(jīng)被排序
⒉ 取出下一個(gè)元素,在已經(jīng)排序的元素序列中從后向前掃描
⒊ 如果該元素(已排序)大于新元素鲜棠,將該元素移到下一位置
⒋ 重復(fù)步驟3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 將新元素插入到下一位置中
⒍ 重復(fù)步驟2~5

public func insertionSort(arr: inout Array<Int>) {

    for i in 0..<arr.count - 1 {
        if arr[i + 1] < arr[i] {
            let temp = arr[i + 1]
            for j in (1...(i + 1)).reversed() {
                if arr[j - 1] > temp {
                    (arr[j - 1],arr[j]) = (arr[j],arr[j - 1])
                }
            }
        }
    }
}

5.冒泡排序

⒈比較相鄰的元素滚婉。如果第一個(gè)比第二個(gè)大,就交換他們兩個(gè)帅刀。
⒉ 對(duì)每一對(duì)相鄰元素作同樣的工作让腹,從開始第一對(duì)到結(jié)尾的最后一對(duì)远剩。在這一點(diǎn),最后的元素應(yīng)該會(huì)是最大的數(shù)骇窍。
⒊ 針對(duì)所有的元素重復(fù)以上的步驟,除了最后一個(gè)腹纳。
⒋ 持續(xù)每次對(duì)越來越少的元素重復(fù)上面的步驟,直到?jīng)]有任何一對(duì)數(shù)字需要比較嘲恍。

public func bubbleSort(arr: inout Array<Int>) {
    for i in 0..<(arr.count - 1) {
        for j in 0..<(arr.count - i - 1) {
            if arr[j] > arr[j + 1] {
                (arr[j],arr[j + 1]) = (arr[j + 1],arr[j])
            }
        }
    }
}

6.快速排序(冒泡排序的改進(jìn)版)

⒈設(shè)置兩個(gè)變量i、j佃牛,排序開始的時(shí)候:i=0淹辞,j=n-1。
⒉ 以第一個(gè)數(shù)組元素作為關(guān)鍵數(shù)據(jù)象缀,賦值給key,即key=A[0]攻冷。
⒊ 從j開始向前搜索娃胆,即由后開始向前搜索(j--)遍希,找到第一個(gè)小于key的值A(chǔ)[j],將A[j]和A[i]互換里烦。
⒋ 從i開始向后搜索凿蒜,即由前開始向后搜索(i++)胁黑,找到第一個(gè)大于key的A[i],將A[i]和A[j]互換丧蘸。
⒌重復(fù)第3、4步刽漂,直到i=j

 public func quickSort(arr: inout Array<Int>, leftIndex:  Int, rightIndex:  Int) {

    if leftIndex < rightIndex {
        var left = leftIndex
        var right = rightIndex
        let midIndex = getMidIndex(arr: &mArray, leftIndex: &left, rightIndex: &right)
        quickSort(arr: &mArray, leftIndex: leftIndex, rightIndex: midIndex - 1)
        quickSort(arr: &mArray, leftIndex: midIndex + 1, rightIndex: rightIndex)
    }
}

private func getMidIndex(arr: inout Array<Int>, leftIndex: inout Int, rightIndex: inout Int) -> (Int) {
    let temp = arr[leftIndex]
    while leftIndex < rightIndex {

        while leftIndex < rightIndex && temp <= arr[rightIndex] {
            rightIndex -= 1
        }
        if leftIndex < rightIndex {
            arr[leftIndex] = arr[rightIndex]
        }
        while leftIndex < rightIndex && arr[leftIndex] <= temp {
            leftIndex += 1
        }
        if leftIndex < rightIndex {
            arr[rightIndex] = arr[leftIndex]
        }
    }
    arr[leftIndex] = temp
    return leftIndex
}

7.歸并排序(速度僅次于快速排序)

⒈將序列每相鄰兩個(gè)數(shù)字進(jìn)行歸并操作(merge)弟孟,形成floor(n/2)個(gè)序列贝咙,排序后每個(gè)序列包含兩個(gè)元素拂募。
⒉ 將上述序列再次歸并窟她,形成floor(n/4)個(gè)序列蔼水,每個(gè)序列包含四個(gè)元素。
⒊ 重復(fù)步驟2趴腋,直到所有元素排序完畢。

 public func mergeSort(arr: inout Array<Int>) {
    var tempArr: Array<Array<Int>> = []
    for item in arr {
       var subArr: Array<Int> = []
       subArr.append(item)
       tempArr.append(subArr)
    }
    while tempArr.count != 1 {
        var i = 0
        while i < tempArr.count - 1 {
            tempArr[i] = mergeTowArr(arr1: tempArr[i], arr2: tempArr[i+1])
            tempArr.remove(at : i+1)
            i += 1
        }
    }
 }

private func mergeTowArr(arr1: Array<Int>, arr2: Array<Int>) -> Array<Int> {
    var mergeArr: Array<Int> = []
    var firstIndex = 0
    var secondIndex = 0
    while firstIndex < arr1.count && secondIndex < arr2.count {
        if arr1[firstIndex]  < arr2[secondIndex] {
            merge.append(arr1[firstIndex])
            firstIndex += 1
        }else{
            merge.append(arr2[secondIndex])
            secondIndex += 1
        }
    }
    while firstIndex < arr1.count {
         merge.append(arr1[firstIndex])
         firstIndex += 1
    }
    while secondIndex < arr2.count {
         merge.append(arr2[secondIndex])
         secondIndex += 1
    }

    return mergeArr
}

8.選擇排序

選擇排序(Selection sort)是一種簡單直觀的排序算法疏叨。它的工作原理是每一次從待排序的數(shù)據(jù)元素中選出最写┢省(或最大)的一個(gè)元素,存放在序列的起始位置糊余,直到全部待排序的數(shù)據(jù)元素排完。 選擇排序是不穩(wěn)定的排序方法(比如序列[5贬芥, 5, 3]第一次就將第一個(gè)[5]與[3]交換蘸劈,導(dǎo)致第一個(gè)5挪動(dòng)到第二個(gè)5后面)

public func selectSort(arr: inout Array<Int>) {
    for i in 0..<arr.count {
        var index = i
        for j in (i + 1)..<arr.count {
            if arr[index] > arr[j] {
                index = j
            }
        }
        if index != i {
            (arr[i],arr[index]) = (arr[index],arr[i])
        }
    }
}

9.堆排序(選擇排序的一種)

通過headMakeFrom將數(shù)組arr變?yōu)榇箜敹眩侔汛箜敹训牡谝恢岛妥詈笠粋€(gè)值交換贤惯,數(shù)組長度減1棒掠。通過heapAdjast將交換后的數(shù)組重新排序成大頂堆直到數(shù)組長度為0孵构。

public func heapSort(arr: inout Array<Int>) {//時(shí)間復(fù)雜度O(n*logn)
    var endIndex = arr.count - 1
    headMakeFrom(arr: &arr)

    while endIndex > 0 {
        (arr[0],arr[endIndex]) = (arr[endIndex],arr[0])
        heapAdjast(arr: &arr,starIndex: 1, arrLength: endIndex)
        endIndex -= 1
    }
}


private func heapMakeFrom(arr: inout Array<Int>) {
    var lastHead = arr.count/2
    while lastHead > 0 {
        heapAdjast(arr:  &arr, starIndex: lastHead, arrLenght: arr.count)
        lastHead -= 1
    }
}

private func heapAdjast(arr: Array<Int>, starIndex: Int, arrLength: Int) {
    var temp = arr[starIndex - 1]
    var parentIndex = starIndex
    var childIndex = 2 * parentIndex
    while childIndex <= arrLength {
        if childIndex < arrLength && arr[childIndex] > arr[childIndex - 1] {
            childIndex += 1
        }
        if arr[childIndex-1] > temp {
            arr[parentIndex - 1] = arr[childIndex - 1]
        }else{
            break 
        }
        parentIndex = childIndex
        childIndex = 2 * parentIndex 
    }
    arr[parentIndex - 1] = temp
}

10. 生成指定尺寸的純色圖片

func imageWithColor(color: UIColor!, size: CGSize) -> UIImage{
    var size = size
    if CGSizeEqualToSize(size, CGSizeZero){
        size = CGSizeMake(1, 1)
    }
    let rect = CGRectMake(0, 0, size.width, size.height)
    UIGraphicsBeginImageContext(rect.size)
    let context = UIGraphicsGetCurrentContext()
    CGContextSetFillColorWithColor(context, color.CGColor)
    CGContextFillRect(context, rect)

    let image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()
    return image
}

11- 修改圖片尺寸

func imageScaleToSize(image: UIImage, size: CGSize) -> UIImage{
    // 創(chuàng)建一個(gè)bitmap的context
    // 并把它設(shè)置成為當(dāng)前正在使用的context
    // Determine whether the screen is retina
    if UIScreen.mainScreen().scale == 2.0{
        UIGraphicsBeginImageContextWithOptions(size, false, 2.0)
    }else{
        UIGraphicsBeginImageContext(size)
    }

    // 繪制改變大小的圖片
    image.drawInRect(CGRectMake(0, 0, size.width, size.height))

    // 從當(dāng)前context中創(chuàng)建一個(gè)改變大小后的圖片
    let scaledImage = UIGraphicsGetImageFromCurrentImageContext()

    // 使當(dāng)前的context出堆棧
    UIGraphicsEndImageContext()

    // 返回新的改變大小后的圖片
    return scaledImage
}

12. 壓縮圖片大小

func imageCompress(originalImage: UIImage) -> UIImage{
    guard let imageData = UIImageJPEGRepresentation(originalImage, 0.5) else{
        return originalImage
    }

    let compressImage = UIImage(data: imageData)!
    return compressImage
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末颈墅,一起剝皮案震驚了整個(gè)濱河市雾袱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谜酒,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粘驰,死亡現(xiàn)場離奇詭異屡谐,居然都是意外死亡蝌数,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門顶伞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滑潘,你說我怎么就攤上這事∮锫保” “怎么了酪刀?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵粹舵,是天一觀的道長骂倘。 經(jīng)常有香客問我,道長历涝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任诱担,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘料睛。我一直安慰自己,他們只是感情好恤煞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著概漱,像睡著了一般喜喂。 火紅的嫁衣襯著肌膚如雪瓤摧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天腻异,我揣著相機(jī)與錄音这揣,去河邊找鬼悔常。 笑死给赞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的片迅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼罐旗,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了九秀?” 一聲冷哼從身側(cè)響起粘我,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎征字,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體匙姜,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年框杜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了袖肥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡油狂,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出专筷,到底是詐尸還是另有隱情弱贼,我是刑警寧澤仁堪,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站鸟辅,受9級(jí)特大地震影響莺葫,放射性物質(zhì)發(fā)生泄漏匪凉。R本人自食惡果不足惜捺檬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堡纬。 院中可真熱鬧,春花似錦蛋济、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侣肄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間茫孔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留畔濒,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像毅整,于是被迫代替她去往敵國和親绽左。 傳聞我的和親對(duì)象是個(gè)殘疾皇子悼嫉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

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

  • 1.插入排序 ⒈ 從第一個(gè)元素開始总棵,該元素可以認(rèn)為已經(jīng)被排序⒉ 取出下一個(gè)元素改含,在已經(jīng)排序的元素序列中從后向前掃描...
    是小胖阿閱讀 328評(píng)論 0 1
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序捍壤,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,732評(píng)論 0 15
  • 概述 排序有內(nèi)部排序和外部排序鹃觉,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大帜慢,一次不能容納全部...
    蟻前閱讀 5,186評(píng)論 0 52
  • 那個(gè)她抽减,不是一個(gè)人允青,是一群人卵沉,是一個(gè)龐大的家庭。 DISC雙證班社群是個(gè)奇怪的所在史汗。 今年3月參加超級(jí)個(gè)體活動(dòng)時(shí)被...
    于長慧Nicole閱讀 332評(píng)論 0 1
  • 文/Nichole 文學(xué)/情感 恬恬:表姐,我覺得你好像明星哦瓷蛙。 我:為什么呢悼瓮! 恬恬:因?yàn)槟愫苊姥剑?我:明星是...
    翁萍閱讀 398評(píng)論 0 0