包装的可选值不应该总是用关键字 'Optional' 打印吗?
Shouldn't wrapped optionals always print with the keyword 'Optional'?
代码
func downloadimages (URL: NSURL) {
let request = NSMutableURLRequest ( URL: URL)
request.HTTPMethod = "GET"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error ) in
guard error == nil else {
print("we have an error from Server")
return
}
var JSONData: AnyObject!
do {
JSONData = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) /* as? [String:AnyObject?] */
} catch {
print (" We had a Parsing issue '\(data)'")
return
}
print(JSONData)// Doesn't print 'Optional' word?????
print(JSONData!)
if let something = JSONData!["photos"]{
print (something!)
print(something) // This prints the word 'Optional as well'
}
输出
//printed unwrapped--NOT GOOD! -- I didn't unwrap it with '!'
{
photos = {
page = 1;
pages = 622374;
perpage = 1;
photo = (
{
farm = 8;
id = 27765969370;
isfamily = 0;
isfriend = 0;
ispublic = 1;
owner = "8262787@N07";
secret = 6daeee7d68;
server = 7233;
title = "Stars, Planets and Lightning Bugs";
}
);
total = 622374;
};
stat = ok;
}
// unwrapped printed--Good!
{
photos = {
page = 1;
pages = 622374;
perpage = 1;
photo = (
{
farm = 8;
id = 27765969370;
isfamily = 0;
isfriend = 0;
ispublic = 1;
owner = "8262787@N07";
secret = 6daeee7d68;
server = 7233;
title = "Stars, Planets and Lightning Bugs";
}
);
total = 622374;
};
stat = ok;
}
//Unwrapped printed--Good
{
page = 1;
pages = 622374;
perpage = 1;
photo = (
{
farm = 8;
id = 27765969370;
isfamily = 0;
isfriend = 0;
ispublic = 1;
owner = "8262787@N07";
secret = 6daeee7d68;
server = 7233;
title = "Stars, Planets and Lightning Bugs";
}
);
total = 622374;
}
//wrapped and prints as optional--Good!
Optional({
page = 1;
pages = 622374;
perpage = 1;
photo = (
{
farm = 8;
id = 27765969370;
isfamily = 0;
isfriend = 0;
ispublic = 1;
owner = "8262787@N07";
secret = 6daeee7d68;
server = 7233;
title = "Stars, Planets and Lightning Bugs";
}
);
total = 622374;
})
我的困惑是,如果 JSONData 是可选的,那么为什么它在没有 !
的情况下打印为非可选的,如果它不是可选的,那么为什么它不给出任何错误 [=14] =].因为展开一个非可选的是错误的!
我的猜测是我不明白我的 JSONData
的类型到底是什么...
我的猜测是我不明白我的 JSONData 的类型到底是什么...
我相信这就是重点。
您已将 JSONData
声明为 AnyObject!
,也称为 ImplicitlyUnwrappedOptional<AnyObject>
。
因此,在您的代码 print(JSONData)
中,JSONData
的值被隐式展开。
并在 Xcode 的“快速帮助”窗格中检查 something
的类型。它应该显示为 AnyObject?
,又名 Optional<AnyObject>
。
一件坏事是,当隐式解包发生时,它没有得到很好的记录。您可能需要了解更多有关 ImplicitlyUnwrappedOptional
的信息,然后才能确切知道发生这种情况的时间。
代码
func downloadimages (URL: NSURL) {
let request = NSMutableURLRequest ( URL: URL)
request.HTTPMethod = "GET"
let task = NSURLSession.sharedSession().dataTaskWithRequest(request) { (data, response, error ) in
guard error == nil else {
print("we have an error from Server")
return
}
var JSONData: AnyObject!
do {
JSONData = try NSJSONSerialization.JSONObjectWithData(data!, options: .AllowFragments) /* as? [String:AnyObject?] */
} catch {
print (" We had a Parsing issue '\(data)'")
return
}
print(JSONData)// Doesn't print 'Optional' word?????
print(JSONData!)
if let something = JSONData!["photos"]{
print (something!)
print(something) // This prints the word 'Optional as well'
}
输出
//printed unwrapped--NOT GOOD! -- I didn't unwrap it with '!'
{
photos = {
page = 1;
pages = 622374;
perpage = 1;
photo = (
{
farm = 8;
id = 27765969370;
isfamily = 0;
isfriend = 0;
ispublic = 1;
owner = "8262787@N07";
secret = 6daeee7d68;
server = 7233;
title = "Stars, Planets and Lightning Bugs";
}
);
total = 622374;
};
stat = ok;
}
// unwrapped printed--Good!
{
photos = {
page = 1;
pages = 622374;
perpage = 1;
photo = (
{
farm = 8;
id = 27765969370;
isfamily = 0;
isfriend = 0;
ispublic = 1;
owner = "8262787@N07";
secret = 6daeee7d68;
server = 7233;
title = "Stars, Planets and Lightning Bugs";
}
);
total = 622374;
};
stat = ok;
}
//Unwrapped printed--Good
{
page = 1;
pages = 622374;
perpage = 1;
photo = (
{
farm = 8;
id = 27765969370;
isfamily = 0;
isfriend = 0;
ispublic = 1;
owner = "8262787@N07";
secret = 6daeee7d68;
server = 7233;
title = "Stars, Planets and Lightning Bugs";
}
);
total = 622374;
}
//wrapped and prints as optional--Good!
Optional({
page = 1;
pages = 622374;
perpage = 1;
photo = (
{
farm = 8;
id = 27765969370;
isfamily = 0;
isfriend = 0;
ispublic = 1;
owner = "8262787@N07";
secret = 6daeee7d68;
server = 7233;
title = "Stars, Planets and Lightning Bugs";
}
);
total = 622374;
})
我的困惑是,如果 JSONData 是可选的,那么为什么它在没有 !
的情况下打印为非可选的,如果它不是可选的,那么为什么它不给出任何错误 [=14] =].因为展开一个非可选的是错误的!
我的猜测是我不明白我的 JSONData
的类型到底是什么...
我的猜测是我不明白我的 JSONData 的类型到底是什么...
我相信这就是重点。
您已将 JSONData
声明为 AnyObject!
,也称为 ImplicitlyUnwrappedOptional<AnyObject>
。
因此,在您的代码 print(JSONData)
中,JSONData
的值被隐式展开。
并在 Xcode 的“快速帮助”窗格中检查 something
的类型。它应该显示为 AnyObject?
,又名 Optional<AnyObject>
。
一件坏事是,当隐式解包发生时,它没有得到很好的记录。您可能需要了解更多有关 ImplicitlyUnwrappedOptional
的信息,然后才能确切知道发生这种情况的时间。