无法调用类型' int'的初始值设定项使用类型' NSString的参数列表?'

时间:2017-09-05 13:07:23

标签: swift

我正在开发一个应用程序,我必须从网页上阅读。或者这是我的应用程序的解决方案。它正在从数据库中读取,但是在使用JSON时我有错误,所以我尝试了这个,因为我只需要读取一个数字。但是当我下载网页代码时,这只是" 3"例如,只是数字。在我的程序中它就像(NSString?),有没有可能在INT中转换它?

let url = NSURL(string: "http://servis.dronysitmp.cz/cteni.php")

    if url != nil {

        let task = URLSession.shared.dataTask(with: url! as URL, completionHandler: { (data, response, error) -> Void in

            //print(data)                
            if error == nil {

                let urlContent = NSString(data: data!, encoding: String.Encoding.ascii.rawValue) as NSString!

                let urlContent2: Int = Int(urlContent)
                print(urlContent!)
            }
        }
        task.resume()
    }

1 个答案:

答案 0 :(得分:1)

Josef,你没有正确使用普通的Swift模式。而不是

let url = ...
if url != nil { ...

使用此模式可以提高易读性:

if let url = ... {

在这种情况下,url是非可选的,不能是nil。这个结构在Swift中称为“safe-unwrapping an optional”。

下一部分看起来不太好的代码是:

let urlContent = NSString(data: data!, encoding: String.Encoding.ascii.rawValue) as NSString!

如果使用NSString构造函数,则无需将其强制转换为NSString。你可能想要实现的是绕过NSString(data:encoding:)返回一个可选项的事实 - 它有充分的理由,因为它不能保证永远成功。因此,你应该做这样的事情:

if let urlContent = NSString(data: data!, encoding: String.Encoding.ascii.rawValue) {

确保在NSString无法将提供的data转换为整数时,在这种情况下不会发生崩溃。

最后,请考虑以下两个一般性建议:

  1. 在未事先测试nil的情况下,切勿使用强制解包可选项。 I. e。永远不要这样做:variable!如果你不能100%确定variable是非零的。因此,您示例中的NSString(data: data!,...并不好。
  2. 如果存在纯Swift替代品,请尽量避免使用Foundation类(像NSString这样的NS之类的东西)。在您的示例中:if let urlContent = String(data: data!, encoding: String.Encoding.ascii.rawValue) {。这使得你的代码“更快”,这是Swift程序员更喜欢的......