包装的可选值不应该总是用关键字 '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 的信息,然后才能确切知道发生这种情况的时间。