美文网首页Swift 基础
Swift Founction 和 Closures

Swift Founction 和 Closures

作者: Ian_ | 来源:发表于2020-08-04 15:52 被阅读0次

可变参数数量和参数泛型约束

  1. 可以使用 ..., 来设置可变参数数量
  2. 使用 where 约束泛型实现特定的协议
func sum<T>(_ numbers: T...) -> T where T: Numeric {
    var total: T = 0
    for number in numbers {
        total += number
    }
    return total
}
print(sum(1, 2, 3, 4, 5))
print(sum(1.1, 2, 3, 4, 5))

// print 
15
15.1

方法类型和嵌套方法

  1. swift 的 function 也是变量, 可以进行作为参数进行传递
  2. 可以在一个方法中嵌套其他的方法
    如下:
func chooseStepFunction(backward: Bool) -> (Int) -> Int {
    func stepForward(input: Int) -> Int { return input + 1 }
    func stepBackward(input: Int) -> Int { return input - 1 }
    return backward ? stepBackward : stepForward
}
var currentValue = -4
let moveNearerToZero = chooseStepFunction(backward: currentValue > 0)
// moveNearerToZero now refers to the nested stepForward() function
while currentValue != 0 {
    print("\(currentValue)... ")
    currentValue = moveNearerToZero(currentValue)
}
print("zero!")

// print
-4... 
-3... 
-2... 
-1... 
zero!

闭包和内部函数捕获对象

把方法赋值给比闭包的时候要注意循环引用的问题,

class A {
    var k: (() -> Void)?
    func a() {
        print("a run")
        func b() {
            print(self)
        }
        
        b()
    }
    
    deinit {
        print("a deinit")
    }
}

autoreleasepool {
    let a = A()
    a.a()
}

print("end")
class A {
    var k: (() -> Void)?
    func a() {
        print("a run")
        func b() {
            print(self)
        }
        
        k = b
    }
    
    deinit {
        print("a deinit")
    }
}

autoreleasepool {
    let a = A()
    a.a()
}

print("end")

// print 
a run
end
class A {
    var k: (() -> Void)?
    func a() {
        print("a run")
        weak var s = self
        func b() {
            if let s = s {
                print(s)
            }
        }

        k = b
    }
    
    deinit {
        print("a deinit")
    }
}

autoreleasepool {
    let a = A()
    a.a()
}

print("end")

// print
a run
a deinit
end

As an optimization, Swift may instead capture and store a copy of a value if that value is not mutated by a closure, and if the value is not mutated after the closure is created.

Swift also handles all memory management involved in disposing of variables when they are no longer needed.
上面的意思是, 闭包捕获值类型参数同样满足 copy on write.

类型方法

和类型属性一样, 可以使用 classstatic 进行修饰, 如果是 class 可以被子类继承, 值类型没有 class 进行修饰.

相关文章

  • Swift Founction 和 Closures

    可变参数数量和参数泛型约束 可以使用 ..., 来设置可变参数数量 使用 where 约束泛型实现特定的协议 方法...

  • Swift Closures | Swift 闭包

    更新至Swift 3.0 基本语法 Closures 在 Swift 中的概念类似 C 和 Objective-C...

  • Swift中的Closure

    结论:Swift closures capture a reference to the outer variab...

  • Swift:函数与闭包(block)

    Functions and Closures github:Swift基础实例github:SwiftBasicT...

  • 100 Days of Swift - Day 06 - 闭包(

    100 Days of Swift - Day 06 - 闭包Closures 6.1 闭包 Swift函数也属于...

  • Swift - Closures

    方法是特殊的闭包 全局方法:一个有名字并且没有捕获任何值的闭包 嵌套方法:一个有名字并且能捕获从外部方法的值 闭包...

  • <iOS 实践经验>判断循环引用的小技巧

    在 swift 中经常使用 Closures, 但有的时候使用 Closures 会造成一些不可避免的问题, 比如...

  • Escaping Closures - Swift

    逃逸闭包和非逃逸闭包 逃逸闭包(escaping closure),什么是逃逸闭包?苹果官方给的定义是:当一个闭包...

  • Swift Closures Tips

    闭包表达式语法的一般形式: let names = ["Chris", "Alex", "Ewa", "Barry...

  • Swift Closures随想

    本文不会对Closures的基本语法进行解读,如果对于Closures语法有所疑惑,请参考Apple官方文档本文主...

网友评论

    本文标题:Swift Founction 和 Closures

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