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
}