Swift 2无法调用' FSEventStreamCreate'具有类型的参数列表

Swift 2无法调用' FSEventStreamCreate'具有类型的参数列表

问题描述:

使用 Swift 2 和 Xcode 7 beta 2(版本:7A121l)时,我使用 FSEventStream API 和 @convention(c) 收到此编译错误.

Using Swift 2 and Xcode 7 beta 2 (Build: 7A121l) I get this compile error using FSEventStream API and @convention(c).

任何建议都会很棒,谢谢!

Any advice would be awesome, thanks!

internal class FileSystem {

init () {

    let allocator: CFAllocator? = kCFAllocatorDefault

    // Create FSEventStream and return valid FSEventStreamRef
    // Alias FSEventStreamCallback - CFunction

    typealias FSEventStreamCallback = @convention(c) (ConstFSEventStreamRef, UnsafeMutablePointer<Void>, UInt, UnsafeMutablePointer<Void>, UnsafePointer<FSEventStreamEventFlags>, UnsafePointer<FSEventStreamEventId>) -> Void

    let callback: FSEventStreamCallback = {
        (streamRef, clientCallBackInfo, numEvents, eventPaths, eventFlags, eventIds) -> Void in
        print ("changed")
        // handle file event
    }

    let context: UnsafeMutablePointer<FSEventStreamContext> = nil
    let pathsToWatch: CFArray = [NSHomeDirectory() + "/Dir"]
    let sinceWhen: FSEventStreamEventId = UInt64(kFSEventStreamEventIdSinceNow)
    let latency: CFTimeInterval = 1.0
    let flags: FSEventStreamCreateFlags = UInt32(kFSEventStreamCreateFlagNone)

    let eventStream = FSEventStreamCreate(
        allocator,
        callback,
        context,
        pathsToWatch,
        sinceWhen,
        latency,
        flags
    )

    FSEventStreamScheduleWithRunLoop(eventStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)
    FSEventStreamStart(eventStream)

}
}

您使用了错误的签名(UInt不是Int):

You are using the wrong signature (UInt not Int):

typealias FSEventStreamCallback = @convention(c) (ConstFSEventStreamRef, UnsafeMutablePointer<Void>, Int, UnsafeMutablePointer<Void>, UnsafePointer<FSEventStreamEventFlags>, UnsafePointer<FSEventStreamEventId>) -> Void

这可以很好地编译:

init () {

    let allocator: CFAllocator? = kCFAllocatorDefault

    // Create FSEventStream and return valid FSEventStreamRef
    // Alias FSEventStreamCallback - CFunction
    typealias FSEventStreamCallback = @convention(c) (ConstFSEventStreamRef, UnsafeMutablePointer<Void>, Int, UnsafeMutablePointer<Void>, UnsafePointer<FSEventStreamEventFlags>, UnsafePointer<FSEventStreamEventId>) -> Void
    let callback: FSEventStreamCallback = {
        (streamRef, clientCallBackInfo, numEvents, eventPaths, eventFlags, eventIds) -> Void in
        print ("changed")
        // handle file event
    }


    let context: UnsafeMutablePointer<FSEventStreamContext> = nil
    let pathsToWatch: CFArray = [NSHomeDirectory() + "/Dir"]
    let sinceWhen: FSEventStreamEventId = UInt64(kFSEventStreamEventIdSinceNow)
    let latency: CFTimeInterval = 1.0
    let flags: FSEventStreamCreateFlags = UInt32(kFSEventStreamCreateFlagNone)

    let eventStream = FSEventStreamCreate(
        allocator,
        callback,
        context,
        pathsToWatch,
        sinceWhen,
        latency,
        flags
    )

    FSEventStreamScheduleWithRunLoop(eventStream, CFRunLoopGetCurrent(), kCFRunLoopDefaultMode)
    FSEventStreamStart(eventStream)

}