Skip to content

Latest commit

 

History

History
46 lines (35 loc) · 1.47 KB

11.3 函数指针 FunctionPointers .md

File metadata and controls

46 lines (35 loc) · 1.47 KB

第十一章:互用性 Interoperability

11.3 函数指针

本小节主要用过调用c中的qsort函数来做字符串排序的Demo, 并且讲了每一个参数的含义。 具体demo如下。

public func qsort(
_ __base: UnsafeMutableRawPointer!,
_ __nel: Int,
_ __width: Int,
_ __compar: @escaping @convention(c) (UnsafeRawPointer?,
UnsafeRawPointer?)
-> Int32)


func qsortStrings(array: inout [String]) {
    qsort(&array, array.count, MemoryLayout<String>.stride) { a, b in
    let l = a!.assumingMemoryBound(to: String.self).pointee 
    let r = b!.assumingMemoryBound(to: String.self).pointee 
    if r > l {
        return -1
    }else if r == l {
        return 0 
    } else { 
        return 1 
    } 
}
}

· 第一个参数 指向数组首个元素的指针。这和使用 Swift 函数的 inout 参数的规则是一样的。

· 第二个参数 元素的个数。数组的count属性就可以了。

· 第三个参数 元素的宽度,使用了MemoryLayout.stride获取,而不是用MemoryLayout.size(由于空隙宽度的原因可能会不准确)。

· 最后一个参数 一个指向C函数的指针,这个C函数用来比较数组中的两个元素。

知识点1:

书中还提到了block 并不是 C 标准的一部分 (来自wiki)感兴趣的同学可以瞅瞅。

全书over🌜🌛~