努力将 NSArray 解析为带分隔符的字符串以在 swift 中生成二维码

Struggling to parse NSArray to a string with delimiter to produce a QR code in swift

您好,我目前正在尝试解析由 alamofire 生成的 JSON 数组,如下所示:

[
    {
        "UUID": "31ea524c-4d19-46f7-b3ec-c9264f9dbc78"
    },
    {
        "UUID": "d0c89800-bbae-4189-88ab-503c6b68b511"
    }
]

我需要获取这些值并将它们呈现为逗号分隔的字符串,因此它们看起来像这样:

"31ea524c-4d19-46f7-b3ec-c9264f9dbc78, d0c89800-bbae-4189-88ab-503c6b68b511"

 Alamofire.request(URL_GET_ORDER, method: .post, parameters: parameters).responseJSON
            {
                response in
                //printing response
                print(response)

                if let result = response.result.value {

                    let jsonData = result as! NSArray


                 }

我需要从上面的数组中获取数据并将其传递给一个字符串,然后将该字符串输入到此代码中以生成一个二维码,然后可以将其作为点击收集系统的一部分进行扫描:

let myString = "*JOINED STRING GOES HERE*"
        // Get data from the string
        let data = myString.data(using: String.Encoding.ascii)
        // Get a QR CIFilter
        guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return }
        // Input the data
        qrFilter.setValue(data, forKey: "inputMessage")
        // Get the output image
        guard let qrImage = qrFilter.outputImage else { return }
        // Scale the image
        let transform = CGAffineTransform(scaleX: 10, y: 10)
        let scaledQrImage = qrImage.transformed(by: transform)
        // Do some processing to get the UIImage
        let context = CIContext()
        guard let cgImage = context.createCGImage(scaledQrImage, from: scaledQrImage.extent) else { return }
        let processedImage = UIImage(cgImage: cgImage)

        self.myImageView.image = processedImage

我已经尝试了很多解决方案,如下所示:

let stringRepresentation = jsonData.joinWithSeparator("-")

和:

let objCArray = NSMutableArray(array: jsonData)

                let swiftArray = objCArray as NSArray as? [String]


                print(swiftArray ?? "BrokeAgain!!") // returns nil


                let nustr = swiftArray?.joined(separator:",")

最简单的方法是从 Codable 数据模型开始,它表示 json 数组中的单个对象。

struct ResponseObject: Codable {
    let uuid: String
}

然后您可以将普通响应数据解码为对象数组 – 使用起来更容易。

func getUUIDList(_ complection: @escaping (String?) -> Void) {
    Alamofire
        .request(URL_GET_ORDER, method: .post, parameters: parameters)
        .response { response in
            guard let data = response.data else {
                completion(nil)
                return
            }

            do {
                let decoder = JSONDecoder()
                let objects = try decoder.decode([ResponseObject].self, from: data)
                completion(
                    objects
                        .map { [=11=].uuid }
                        .joined(separator: ", ")
                )
            } catch let error {
                print(error)
                completion(nil)
            }
    }
}

最后将您的调用 Alamofire.request(URL_GET_ORDER, method: .post, parameters: parameters)... 替换为:

// somewhere you call the alamofire
getUUIDList() { responseString in
    guard let responseString = responseString else { return }

    // Get data from the string
    let data = responseString.data(using: String.Encoding.ascii)
    // Get a QR CIFilter
    guard let qrFilter = CIFilter(name: "CIQRCodeGenerator") else { return }
    // Input the data
    qrFilter.setValue(data, forKey: "inputMessage")
    // Get the output image
    guard let qrImage = qrFilter.outputImage else { return }
    // Scale the image
    let transform = CGAffineTransform(scaleX: 10, y: 10)
    let scaledQrImage = qrImage.transformed(by: transform)
    // Do some processing to get the UIImage
    let context = CIContext()
    guard let cgImage = context.createCGImage(scaledQrImage, from: scaledQrImage.extent) else { return }
    let processedImage = UIImage(cgImage: cgImage)

    self.myImageView.image = processedImage
}

请注意,这只是一个非测试指南,您应该如何操作。不要期望代码在复制和粘贴后会起作用,但这是一个很好的起点:)