1

我正在尝试使用ZipZap方法

ZZArchiveEntry(fileName: String!, compress: Bool, dataBlock: ((NSErrorPointer) -> NSData!)!)

在 Swift 中,但无法找出 dataBlock 闭包的正确语法。我尝试了以下代码:

let fileEntry = ZZArchiveEntry(fileName: "test.txt", compress: true, dataBlock: {
            (error: NSErrorPointer) in
            return "test".dataUsingEncoding(NSUTF8StringEncoding)!
        })

这导致以下错误:

Cannot find an initializer for type 'ZZArchiveEntry' that accepts an argument list of type '(fileName: String, compress: Bool, dataBlock: (NSErrorPointer) -> _)'

这样的闭包是否可能,如果是,在 Xcode 7.0 beta 3 中如何?

4

3 回答 3

0

您可以使用 Swift 的尾随闭包语法,如下所示:

let fileEntry = ZZArchiveEntry(fileName: "test.txt", compress: true) { (error) -> NSData! in
    return ("test" as NSString).dataUsingEncoding(NSUTF8StringEncoding)!
}

或者更简单地说:

let fileEntry = ZZArchiveEntry(fileName: "test.txt", compress: true) { error in
    ("test" as NSString).dataUsingEncoding(NSUTF8StringEncoding)!
}

您还需要显式"test"转换NSString为使用该dataUsingEncoding(_:)方法。

于 2015-07-28T14:19:48.983 回答
0

顺便说一句,Xcode 可以自动为你编写闭包。对于选择关闭,例如按下 Tab 按钮,您将看到:

在此处输入图像描述

然后按键盘上的 Enter 键,Xcode 将写入所有括号和所需的参数。 在此处输入图像描述

于 2015-07-28T14:25:41.643 回答
0

您正在返回一个未包装的可选NSData(即您正在返回一个非可选)并且编译器只是变得困惑。

您可以通过在变量中暂存值来解决它:

let fileEntry = ZZArchiveEntry(fileName: "test.txt", compress: true, dataBlock: {
    (error: NSErrorPointer) in
    let data = "test".dataUsingEncoding(NSUTF8StringEncoding)!
    return data
})

或者,因为该闭包的预期返回类型是可选的,如果您删除它!,错误就会消失:

let fileEntry = ZZArchiveEntry(fileName: "test.txt", compress: true, dataBlock: {
    (error: NSErrorPointer) in
    return "test".dataUsingEncoding(NSUTF8StringEncoding)
})

或者,正如其他人指出的那样,您可以进一步简化:

let fileEntry = ZZArchiveEntry(fileName: "test.txt", compress: true) { error in
    return "test".dataUsingEncoding(NSUTF8StringEncoding)
}
于 2015-07-28T14:39:54.000 回答