如何使用闭包返回数组

时间:2017-02-20 07:02:32

标签: ios swift swift3

我是Swift的新手,我正在尝试使用闭包从viewcontroller获取结果

以下是示例

class MD5Calculator {

    static func imageChecksum(imageArray: [UIImage], onCalculated: @escaping () -> [String]){

        DispatchQueue.global(qos: .userInitiated).async {

            var array: [String] = []

            for chosenImage in imageArray {
                if let jpegData = UIImageJPEGRepresentation(chosenImage, 80) {
                    let checksum = jpegData.md5()
                    let chsum = checksum.toHexString()
                    array.append(chsum)
                }
            }

            DispatchQueue.main.async {
                //return array
            }
        }

    }
}

我想在后台执行md5计算,并在完成时将其传递给viewController。

我创造了封闭但我不知道如何归还它。 我的问题是:

  1. 如何使用闭包传递字符串数组

  2. 如何在视图控制器中调用ImageChecksum

3 个答案:

答案 0 :(得分:0)

主要问题是,您已正确定义了闭包。基本上,我们的想法是,如果要在函数内部 ,而不是外部,则应定义具有返回值的闭包。用法(在本例中)类似于:let someConstant = onCalculated()这是您在函数中获取值的方式

在你的情况下(你想从函数返回一个值),闭包应该被定义为:onCalculated: @escaping (_ someArray: [String]) -> Void。在这种情况下,您只需返回函数中的值:onCalculated(someArray)

用法:

MD5Calculator.imageChecksum(
    imageArray: inputImageArray, 
    onCalculated: { someArray in
        // enter code here
    }
)

P.S。考虑使用可选的unwrap for closures!

答案 1 :(得分:0)

您对封闭的使用无效。您要发回的数组应该是闭包的参数而不是返回类型。

这应该有效

class MD5Calculator {

    static func imageChecksum(imageArray: [UIImage], onCalculated: @escaping ([String]) -> ()){

        DispatchQueue.global(qos: .userInitiated).async {

            var array: [String] = []

            for chosenImage in imageArray {
                if let jpegData = UIImageJPEGRepresentation(chosenImage, 80) {
                    let checksum = jpegData.md5()
                    let chsum = checksum.toHexString()
                    array.append(chsum)
                }
            }

            DispatchQueue.main.async {
                //return array
                onCalculated(array)
            }
        }

    }
}

编辑:在您的ViewController中使用它

MD5Calculator.imageChecksum(imageArray: [imageArray]) { array in
    // 'array' is your returned result
}

答案 2 :(得分:0)

您应该将结果数组作为闭包参数发送,而不是作为返回值。

  1. 如何通过闭包传递字符串数组?

    class MD5Calculator {
    
    static func imageChecksum(imageArray: [UIImage], onCalculated: @escaping (_ checksum: [String]) ->()){
    
        DispatchQueue.global(qos: .userInitiated).async {
    
            var array: [String] = []
    
            for chosenImage in imageArray {
                if let jpegData = UIImageJPEGRepresentation(chosenImage, 80) {
                    let checksum = jpegData.md5()
                    let chsum = checksum.toHexString()
                    array.append(chsum)
                }
            }
    
            DispatchQueue.main.async {
                //return array
                onCalculated(array)
            }
        }
    
    }
    }
    
  2. 2.如何在视图控制器中调用ImageChecksum

    MD5Calculator.imageChecksum(imageArray: []) { (checksum) in
    
    }