如何在Swift中将数据转换为整数

6

我正在使用Swift编码。API返回一个需要转换为Int!的Data,我该怎么办?

我需要的响应看起来像:

12345

但是当我打印数据时得到的结果是:

Optional(5 bytes)

API返回一个Int(不是JSON)

//send HTTP req to register user
        let myUrl = URL(string: "http://app.avatejaratsaba1.com/api/Person/Create")
        var request = URLRequest(url: myUrl!)
        request.httpMethod = "POST" // compose a query string
        request.addValue("application/json", forHTTPHeaderField: "content-type")
        request.addValue("application/json", forHTTPHeaderField: "Accept")

        let postString = ["name" : name.text!,
                          "isLegal" : FinalLegalSegment,
                          "codeMelli" : National_ID.text! ] as [String : Any]


do {
            request.httpBody = try JSONSerialization.data(withJSONObject: postString, options: .prettyPrinted)
        }catch let error {
            print(error.localizedDescription)
            self.DisplayMessage(UserMessage: "1Something went wrong , please try again!")
            return
        }

        let task = URLSession.shared.dataTask(with: request)
        {
            (data : Data? , response : URLResponse? , error : Error?) in

            self.removeActivtyIndicator(activityIndicator: MyActivityIndicator)

            if error != nil
            {
                self.DisplayMessage(UserMessage: "2Could not successfully perform this request , please try again later.")
                print("error = \(String(describing : error))")
                return
            }
            else
            {

                print("////////////////////////////////")
                print("data has been sent")

            }
        }



        task.resume()

我无法从我的代码中获取这个数字!API 应该将其发送回来。 - Am1rFT
请在您的if else部分中添加以下代码:print(response) - Jigar
将以下代码添加到if else部分并检查: let jsonResponse = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) print(jsonResponse as! NSDictionary) - Jigar
哪一个更好,你推荐哪一个? - Am1rFT
我不熟悉ASCII码!你能解释一下吗? - Am1rFT
显示剩余19条评论
5个回答

9

可以使用withUnsafeBytes获取指针并加载整数。

let x = data.withUnsafeBytes({

        (rawPtr: UnsafeRawBufferPointer) in
        return rawPtr.load(as: Int32.self)

        })

rawPtr是不安全的原始缓冲区指针,load()函数用于将值返回给x。这可用于获取任何整数。 rawPtr是一个临时指针,不能在块外使用。

自Swift 5以来就可用,旧版本中没有。

public func withUnsafeBytes<ResultType, ContentType>(_ body: (UnsafePointer<ContentType>) throws -> ResultType) rethrows -> ResultType

已弃用。


3
尝试一下这个: let intValue:Int = yourData.withUnsafeBytes {$0.pointee} withUnsafeBytes {$0.pointee} 将返回一个通用类型,您可以将其转换为已知的类型。

2
你应该添加更长的解释,说明为什么这会有帮助,以及如何/在哪里使用它。这可以避免人们只是复制/粘贴代码而不真正理解它。 - dquijada
此外,请将解释添加到答案本身,而不是注释部分。此外,请将解释添加到答案本身,而不是注释部分。 - Nico Haase
'withUnsafeBytes'已经弃用:请使用withUnsafeBytes <R>(_:(UnsafeRawBufferPointer)throws -> R)rethrows-> R代替 - TomH

2

正如我在评论中所写的那样,您的服务器发送整数的文本表示。

您需要编写类似以下内容的代码:

if error != nil
{
    //...
    return
}
else
{
    if let data = data {
        //First convert the data into String
        if let text = String(data: data, encoding: .utf8) {
            //And then into Int
            if let value = Int(text) {
                print(value)
                //... use the value
            } else {
                print("text cannot be converted to Int")
            }
        } else {
            print("data is not in UTF-8")
        }
    } else {
        print("data == nil")
    }
}

如果您不需要一些print语句,上面的代码可能会更简单。


根据Martin R的建议,使用guard,上面的代码看起来像这样:

    guard let data = data else {
        print("data == nil")
        return
    }
    guard let text = String(data: data, encoding: .utf8) else {
        print("data is not in UTF-8")
        return
    }
    guard let value = Int(text) else {
        print("text cannot be converted to Int")
        return
    }
    print(value)
    //... use the value

您可以使用 guard 避免过深的嵌套代码。(您可以使用 guard 检查 error != nil,但我将留给您自行处理。)


@MartinR,好建议,我差点忘了。 - OOPer

2

首先将您的数据转换为字符串,如下所示,然后使用该字符串来初始化int类型。

let stringInt = String.init(data: yourdata, encoding: String.Encoding.utf8)
let int = Int.init(stringInt ?? "")

这将返回一个可选值,您可以解包以进一步使用。

1
那些 .init 是不必要的。还要注意 Int.init(stringInt) 无法编译,因为 stringInt 是一个可选类型。 - Martin R
是的,你可以像Java风格那样在没有初始化的情况下使用它,但这就是我编写代码以了解是否有东西被初始化在这里的方式。 - Devil Decoder
对于可选项,我已经在上面提到了这些句子将返回可选值,您必须对其进行解包。 - Devil Decoder

-2

让 dataString = data.data(using: .utf8, allowLossyConversion: false).debugDescription dataInt = (Int)(dataString)


4
更有帮助的回答(对于提问者和未来的读者)应该解释问题及其解决方案,而不仅仅是放一些代码。 - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接