Swift小技巧(二)

所有小技巧都是基于Swift3

1.swift如何發送、接收、刪除通知

    //定義好通知的名稱
    let notificationName = Notification.Name("Notification")

    override func viewDidLoad() {
        super.viewDidLoad()
        //添加通知接收
        NotificationCenter.default.addObserver(self,
                                               selector: #selector(method(notification:)),
                                               name: notificationName,
                                               object: nil)
        //發送通知
        NotificationCenter.default.post(name: notificationName,
                                        object: nil)
        //移除通知
        NotificationCenter.default.removeObserver(self,
                                                  name: notificationName,
                                                  object: nil)//移除指定
        NotificationCenter.default.removeObserver(self)//移除所有
    }
    
    func method(notification: Notification) {
        print("接收到通知后執行")
    }

    //如果擁有該方法的類不是繼承OC的類,那么該方法前需要加上@objc
    @objc func method(notification: Notification) {
        print("接收到通知后執行")
    }

2.如何解決閉包內部的循環引用問題

        //通過定義捕獲列表解決
        lazy var someClosure: Void -> String = {
            //unowned:無主引用  weak:弱引用
            [unowned self, weak delegate = self.delegate!] in
            // 這里是閉包的函數體
        }

3.如何獲得某個變量的類型字符串

let string = "Hello"
let stringArray = ["one", "two"]
let dictionary = ["key": 2]

//打印具體內容
print(string)//Hello
print(stringArray)//["one", "two"]
print(dictionary)//["key": 2]
//打印類型
print(type(of: string))//"String"
print(type(of: stringArray))//Array<String>
print(type(of: dictionary))//Dictionary<String, Int>
//獲得類型字符串
String(describing: type(of: string)) // "String"
String(describing: type(of: stringArray)) // "Array<String>"
String(describing: type(of: dictionary)) // "Dictionary<String, Int>"
//獲得完整的類型字符串
String(reflecting: type(of: string)) // "Swift.String"
String(reflecting: type(of: stringArray)) // "Swift.Array<Swift.String>"
String(reflecting: type(of: dictionary)) // "Swift.Dictionary<Swift.String, Swift.Int>"

4.如何使用UIAlertController

    func showAlert(title: String, message: String) {
        let alert = UIAlertController(title: title,
                                      message: message,
                                      preferredStyle: .alert)
        let action1 = UIAlertAction(title: "確定",
                                    style: .default) { (action) in
                                        //點擊確定后需要執行的操作寫在這里
                                        print("點擊了確定")
        }
        let action2 = UIAlertAction(title: "取消",
                                    style: .cancel) { (action) in
                                        //點擊取消后需要執行的操作寫在這里
                                        print("點擊了取消")
        }
        alert.addAction(action1)
        alert.addAction(action2)
        self.present(alert,
                     animated: true) {
                        //這里可以進行一些操作
                        print("彈出后回調")
        }
    }

5.如何查找數組內部某個元素或者某些元素

class Person {
    let name: String
    let age: Int
    init(name: String, age: Int) {
        self.name = name
        self.age = age
    }
}
let p1 = Person(name: "a", age: 1)
let p2 = Person(name: "b", age: 2)
let p3 = Person(name: "c", age: 3)
let p4 = Person(name: "c", age: 31)
let array = [p1,p2,p3,p4]
//可以獲得p1的下標為0
var result = array.index { $0 === p1 }
print(result!)
//通過元素內部的某個屬性來查找index
result = array.index { $0.name == "c" }
print(result!)
//index只會返回第一個查找到的,查找多個,需要使用filter
let contents = array.filter { $0.name == "c" }
contents.count//contents會包含所有name=c的值

6.使用下標快速獲得字符串指定位置的字符或者字符串

//給string擴展一些方法
extension String {
    
    var length: Int { return self.characters.count }
    
    //通過string[i]的方式獲得指定位置字符
    subscript (i: Int) -> String {
        return self[Range(i ..< i+1)]
    }
    
    //通過string.substring(from: 3)方式獲取
    func substring(from: Int) -> String {
        return self[Range(min(from, length) ..< length)]
    }
    
    //通過string.substring(to: 3)方式獲取
    func substring(to: Int) -> String {
        return self[Range(0 ..< max(0, to))]
    }
    
    //通過string[1 ..< 3]的方式獲取
    subscript (r: Range<Int>) -> String {
        let range = Range(uncheckedBounds: (lower: max(0, min(length,r.lowerBound)),
                                            upper: min(length, max(0, r.upperBound))))
        let start = index(startIndex, offsetBy: range.lowerBound)
        let end = index(start, offsetBy: range.upperBound - range.lowerBound)
        return self[Range(start ..< end)]
    }
}

//使用
let str = "abcdef"
str[1 ..< 3] // returns "bc"
str[5] // returns "f"
str[80] // returns ""
str.substring(from: 3) // returns "def"
str.substring(to: str.length - 2) // returns "abcd"

7.生成指定位數的整數或者小數,不足位數以0補充

//指定位數字,不足的位數以0補充
extension Int {
    func format(f: String) -> String {
        return String(format: "%\(f)d", self)
    }
}
//保留指定位小數,不足位數以0補充
extension Double {
    func format(f: String) -> String {
        return String(format: "%\(f)f", self)
    }
}
//使用
print(8.format(f: "06"))//000008
print(8.format(f: "02"))//08
print(9999.format(f: "02"))//9999
print(0.12345.format(f: ".2"))//0.12
print(0.1.format(f: ".4"))//0.1000

8.對數組內元素,按照指定屬性指定規則進行排序

struct ImageFile {
    var name: String
    var ID: Int
}

let image1 = ImageFile(name: "a.jpg", ID: 3)
let image2 = ImageFile(name: "c.jpg", ID: 2)
let image3 = ImageFile(name: "b.jpg", ID: 1)
var images = [image1, image2, image3]
images.sort { $0.ID > $1.ID }//從大到小排序
images.sort { $0.name < $1.name }//從小到大排序

9.如何替換字符串中某個特定字符

let string = "This is my string"
//替換" "成"+",最終結果為:"This-is-my-string"

//方法一
let newString1 = string.replacingOccurrences(of: " ", with: "-")
//方法二
let toArray = string.components(separatedBy: " ")
let newString2 = toArray.joined(separator: "+")
//方法三
let newString3 = String(string.characters.map {
    $0 == " " ? "+" : $0
})

10.如何發出http請求

let url = URL(string: "http://www.baidu.com")
let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in
    print(String(data: data!, encoding: .utf8))
}
task.resume()

11.如何修改imageview中image的顏色

override func viewDidLoad() {
        super.viewDidLoad()
        let imageView = UIImageView(frame: CGRect(x: 10, y: 100, width: 20, height: 20))
        imageView.image = UIImage(named: "ADD")
        changeTintColor(imageView: imageView, color: .red)
        view.addSubview(imageView)
    }
    
    func changeTintColor(imageView: UIImageView, color: UIColor) {
        imageView.image = imageView.image!.withRenderingMode(.alwaysTemplate)
        imageView.tintColor = color
    }

效果:

屏幕快照 2017-04-28 下午5.27.48.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創建并操作數組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,265評論 0 4
  • 不知道從啥時候開始喜歡上了她,我感覺自己還是挺強勢的,做人,辦事! 一直不明白,從什么時候,我喜歡她了!我喜歡聽老...
    ManTra灬2017閱讀 245評論 0 0
  • 1大本營入駐倒計時8天 2公司注冊還未搞定 3資源庫分類要推進了
    Ben游天下閱讀 112評論 0 0
  • 女人天生愛做夢,這話一定是對的,每次睡下后總有一個夢隨踵而至。今早沒能睡到自然醒而醒,松軟的床暖暖的被那舍得離開,...
    門閃閃閱讀 205評論 0 1
  • 不說話對于某人來說似乎就是不正常,它會用擔心的目光看著你,心里會想著怎么會有這樣的人。不想說了,神煩著。
    淡粉和深藍閱讀 243評論 0 0