【问题标题】:Swift 2 Cannot invoke 'FSEventStreamCreate' with an argument list of typeSwift 2 无法使用类型参数列表调用“FSEventStreamCreate”
【发布时间】:2015-07-02 00:43:54
【问题描述】:

使用 Swift 2 和 Xcode 7 beta 2(内部版本:7A121l)我使用 FSEventStream API 和 @convention(c) 得到这个编译错误。

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

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)

}
}

【问题讨论】:

    标签: ios xcode macos swift swift2


    【解决方案1】:

    您使用了错误的签名(UInt 不是 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)
    
    }
    

    【讨论】:

    • 不客气。我发现来自 Swift 编译器的一些错误消息很神秘。对我有帮助的是将组合语句分解成更小的块,手动复制本质上语法分析器和代码生成器应该在事情​​成熟时更好地告诉你的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    • 2019-07-20
    • 2016-10-09
    • 1970-01-01
    • 2023-03-07
    相关资源
    最近更新 更多