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
}