Swift:许多内置函数返回可选类型.如果没有丑陋的嵌套if,我怎么能把它们变成正则变量呢



TL;博士?请给我一个如何处理String init方法的例子,该方法可能返回String,也可能返回nil,而不需要:1)将其分配给可选的String var,2)使用丑陋的嵌套循环来处理nil/非nil情况,或者3)假设!永远不会为nil,此时它很可能为nil并且会杀死我的应用程序

我正在学习Swift,并尝试发送REST请求。这是我写的代码开始:

    let restCallStr = String(format:"%@connect/token", arguments:[BASE_REST_URL]);
    restCallStr = restCallStr.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet());
    let restURL = NSURL(string:restCallStr);
    var restRequest = NSMutableURLRequest(URL:restURL);
    restRequest.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type");
    restRequest.HTTPMethod = "POST";
    let completionClosure: (response:NSURLResponse!, data:NSData!, error:NSError!) -> () = {
        var jsonDict:NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error:nil) as NSDictionary;
        println("Response: (jsonDict)");
    };
    NSURLConnection.sendAsynchronousRequest(restRequest, queue: NSOperationQueue(), completionHandler:completionClosure);

看起来和我在Objective-C中所做的很相似,读起来应该有效。。。

但事实并非如此。我正在调用的所有内置init方法(String(format:"", arguments:[])NSURL(string:"")等)都不返回常规String或NSURL变量。。。他们返回期权。

现在我已经对期权进行了研究,我相信我了解了期权的基本原理。我正在努力解决的问题是如何实际地处理它们(并且没有大量丑陋的多余代码)。

网上的建议似乎是"只需使用!就可以将其从可选中去掉"(反对者认为"不,你(几乎)永远不应该使用!!",常识告诉我!在这里没有意义,因为如果值为零,我需要处理它,而不仅仅是崩溃)。

似乎唯一能同时处理零和非零情况的解决方案似乎是if let,所以我决定试一试。在只修改了我的原始代码的2行之后,我已经开始了一个丑陋的嵌套if语句树:

    let restURLStr = String(format:"%@connect/token", arguments:[BASE_REST_URL]);
    if let encodedRestURLStr = restURLStr.stringByAddingPercentEncodingWithAllowedCharacters(.URLHostAllowedCharacterSet())
    {
        if let restURL = NSURL(string:encodedRestURLStr)
        {
            var restRequest = NSMutableURLRequest(URL:restURL);
            restRequest.addValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type");
            restRequest.HTTPMethod = "POST";
            let completionClosure: (response:NSURLResponse!, data:NSData!, error:NSError!) -> () = {
                var jsonDict:NSDictionary = NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions.MutableContainers, error:nil) as NSDictionary;
                println("Response: (jsonDict)");
            };
            NSURLConnection.sendAsynchronousRequest(restRequest, queue: NSOperationQueue(), completionHandler:completionClosure);
        }
        else
        {
            println("Oops, nil assigned to restURL! Better handle that.");
        }
    }
    else
    {
        println("Oops, nil assigned to restCallStr! Better handle that.");
    }

我已经很头疼了,只是在想象如果我每次都要这样做,会是什么样子(以及会导致多少浪费的击键)我做的作业可能是零。

更好的方法。Swift做了很多漂亮的事情,但现在我渴望有一大块好的ol'obj-c代码,在那里我不需要无数的嵌套语句来处理完全可以接受的零值。

怎么了,伙计们?每个人都在谈论Swift是如何精简和令人敬畏的,这是不可能的。

因此,他们添加了一种新的方法来使用guard-let安全地打开东西。在本例中,您可以在外部使用myUrl,因此不再使用iflet嵌套。例如:

   guard let myUrl = NSURL(string:"www.myWebsite.com") else {
   return
   }

最新更新