美文网首页iOS-Swift
Swift编程中的小技巧

Swift编程中的小技巧

作者: 南国青天 | 来源:发表于2017-10-10 16:16 被阅读16次

原文排版 有点让我蛋疼, 将它的精髓技巧整理一下, 于是就有了本文. (侵删)

Defer管理程序控制流

defer语句会推迟包含这个命令的代码执行,直到当前范围终止。也就是说,在defer语句中清理逻辑是可以替换的,而且只要离开相应的调用范围,这段命令就肯定就会被调用。这样可以减少冗余步骤,更重要的是增加安全性。

func deferExample() {
    defer {
        print("Leaving scope, time to cleanup!")
    }
    print("Performing some operation...")
}

deferExample()

// Prints:
// Performing some operation...
// Leaving scope, time to cleanup!

Swizzle_method实现

Swift不必像OC一样实现方法对调, 可以使用下列代码实现方法对调:

import UIKit
class AwesomeClass {
    dynamic func originalFunction() -> String {
        return "originalFunction"
    }  
    dynamic func swizzledFunction() -> String {
        return "swizzledFunction"
    }
}
let awesomeObject = AwesomeClass()
print(awesomeObject.originalFunction()) // prints: "originalFunction"
let aClass = AwesomeClass.self
let originalMethod = class_getInstanceMethod(aClass, "originalFunction")
let swizzledMethod = class_getInstanceMethod(aClass, "swizzledFunction")
method_exchangeImplementations(originalMethod, swizzledMethod)
print(awesomeObject.originalFunction())  // prints: "swizzledFunction"

创建全局Helper函数

全局变量和函数经常被合称为“坏东西”,不过事实是两者都能让代码更干净,真正的坏东西是全局状态。全局函数经常需要全局状态来完成相关工作,因此很容易理解它们为什么会有这样的坏名声。下面是一些Grand Central Dispatch的helper函数样例,不是建立在全局状态之上,而且多少有些语法糖(指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用)的性质。下面我们会采用dispatch_after函数,用Swift的方式来解包:

用Swift语法来解包C函数,让我们的代码更易于一眼理解。找到你最喜欢的函数,试一下吧!只要在正确方法命名上尽责,将来程序的维护者肯定感激我们。如果我们将上面的方法签名修改为delay(delay: Double, closure: ()->()),这就成了不负责任的方法命名反例,因为dispatch_after需要GCD队列,而从名称中看不出来使用的哪个队列。然而,如果我们使用的代码库在主线程所有方法的执行上有既定规范,除非在名称或评论上另有指示,delay(delay: Double, closure: ()->())就可以是一个正确的方法名称。无论我们如何命名helper函数,它们都是为了通过包装样本代码节省时间,让代码更易读

import Foundation

/**
    Executes the closure on the main queue after a set amount of seconds.

    - parameter delay:   Delay in seconds
    - parameter closure: Code to execute after delay
*/
func delayOnMainQueue(delay: Double, closure: ()->()) {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_main_queue(), closure)
}

/**
    Executes the closure on a background queue after a set amount of seconds.

    - parameter delay:   Delay in seconds
    - parameter closure: Code to execute after delay
*/
func delayOnBackgroundQueue(delay: Double, closure: ()->()) {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_global_queue(QOS_CLASS_UTILITY, 0), closure)
}

//封装后调用
delayOnBackgroundQueue(5) {
    showView()
}

//封装前调用
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, Int64(delay * Double(NSEC_PER_SEC))), dispatch_get_global_queue(QOS_CLASS_UTILITY, 0)) {
    showView()
}

相关文章

  • Swift编程中的小技巧

    原文排版 有点让我蛋疼, 将它的精髓技巧整理一下, 于是就有了本文. (侵删) Defer管理程序控制流 defe...

  • Swift编程小技巧

    Swift中有很多有用的小技巧,用好了能使代码更加安全,简洁,易于理解或效率更加高效,在这记录一些编写swifty...

  • Swift小技巧(一)

    所有小技巧都是基于Swift3 1.OC中的#pragma mark在swift中,使用// MARK:来实现 结...

  • Swift 4.1迁移 flatMap to compactMa

    参考文章:Swift 4.1 迁移小技巧 —— CompactMap Swift 4.1引入了compactMap...

  • Swift 中的面向协议编程

    Swift 中面向协议编程的应用,与面向对象不同的编程模式。在 Swift 这个现代化的编程语言中,感受面向协议带...

  • Swift及SwiftUI学习笔记

    持续更新中...... swift官方文档 swift官方文档(英文) 协议 swift主要基于协议编程的,所以协...

  • Swift编程语言 FAQ

    Swift编程语言 FAQ Swift编程语言 FAQ

  • 阿尔法---“Swift编程技巧”

    swift学习写程序心得: 从第一段的hello world开始,我就因为printiln,这种错误的输入方式而无...

  • SwiftUI No.1

    swift是一种混合了面向对象变成,函数式编程,协议式编程的语言 1. Struct swift中的struct叫...

  • 面向协议编程

    面向协议编程 是Swift的一种编程范式,Apple于2015年WWDC提出。 在Swift的标准库中,能见到大量...

网友评论

    本文标题:Swift编程中的小技巧

    本文链接:https://www.haomeiwen.com/subject/ystbyxtx.html