努力将 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
}
请注意,这只是一个非测试指南,您应该如何操作。不要期望代码在复制和粘贴后会起作用,但这是一个很好的起点:)
您好,我目前正在尝试解析由 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
}
请注意,这只是一个非测试指南,您应该如何操作。不要期望代码在复制和粘贴后会起作用,但这是一个很好的起点:)