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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • 不知道从啥时候开始喜欢上了她,我感觉自己还是挺强势的,做人,办事! 一直不明白,从什么时候,我喜欢她了!我喜欢听老...
    ManTra灬2017阅读 238评论 0 0
  • 1大本营入驻倒计时8天 2公司注册还未搞定 3资源库分类要推进了
    Ben游天下阅读 102评论 0 0
  • 女人天生爱做梦,这话一定是对的,每次睡下后总有一个梦随踵而至。今早没能睡到自然醒而醒,松软的床暖暖的被那舍得离开,...
    门闪闪阅读 193评论 0 1
  • 不说话对于某人来说似乎就是不正常,它会用担心的目光看着你,心里会想着怎么会有这样的人。不想说了,神烦着。
    淡粉和深蓝阅读 191评论 0 0