How to unwrap an optional dictionary value in Swift 4+ in one step?





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







1















Given the dictionary of dictionary below, what is the correct syntax to unwrap the Int? in one step?



let dict:Dictionary<String, Dictionary<String, Int?>> = [
"parentKey" : [
"firstKey" : 1,
"secondKey" : nil]
]

let x = "someKey"
let y = "someOtherKey"
var foo = 0

if let goo = dict[x]?[y] { foo = goo } //<-- Error: cannot assign (Int?) to Int

if let goo = dict[x]?[y], let boo = goo { foo = boo } //<-- OK


In the first 'if let', goo is returned as an Int? - goo then needs to be unwrapped as in the second 'if let'...



What is the correct syntax for doing this in one step?










share|improve this question























  • if let goo = dict[x]?[y] ?? NSNotFound { foo = goo } ?

    – Michael Dautermann
    Nov 23 '18 at 4:32











  • This gives the correct result when both keys are valid (e.g. x = "parentKey, y = "firstKey" or y = "secondKey". However, it gives an incorrect result when either x or y is a non-existent key (e.g. x = "someKey" or y = "someOtherKey")

    – Andrew Coad
    Dec 1 '18 at 5:11


















1















Given the dictionary of dictionary below, what is the correct syntax to unwrap the Int? in one step?



let dict:Dictionary<String, Dictionary<String, Int?>> = [
"parentKey" : [
"firstKey" : 1,
"secondKey" : nil]
]

let x = "someKey"
let y = "someOtherKey"
var foo = 0

if let goo = dict[x]?[y] { foo = goo } //<-- Error: cannot assign (Int?) to Int

if let goo = dict[x]?[y], let boo = goo { foo = boo } //<-- OK


In the first 'if let', goo is returned as an Int? - goo then needs to be unwrapped as in the second 'if let'...



What is the correct syntax for doing this in one step?










share|improve this question























  • if let goo = dict[x]?[y] ?? NSNotFound { foo = goo } ?

    – Michael Dautermann
    Nov 23 '18 at 4:32











  • This gives the correct result when both keys are valid (e.g. x = "parentKey, y = "firstKey" or y = "secondKey". However, it gives an incorrect result when either x or y is a non-existent key (e.g. x = "someKey" or y = "someOtherKey")

    – Andrew Coad
    Dec 1 '18 at 5:11














1












1








1








Given the dictionary of dictionary below, what is the correct syntax to unwrap the Int? in one step?



let dict:Dictionary<String, Dictionary<String, Int?>> = [
"parentKey" : [
"firstKey" : 1,
"secondKey" : nil]
]

let x = "someKey"
let y = "someOtherKey"
var foo = 0

if let goo = dict[x]?[y] { foo = goo } //<-- Error: cannot assign (Int?) to Int

if let goo = dict[x]?[y], let boo = goo { foo = boo } //<-- OK


In the first 'if let', goo is returned as an Int? - goo then needs to be unwrapped as in the second 'if let'...



What is the correct syntax for doing this in one step?










share|improve this question














Given the dictionary of dictionary below, what is the correct syntax to unwrap the Int? in one step?



let dict:Dictionary<String, Dictionary<String, Int?>> = [
"parentKey" : [
"firstKey" : 1,
"secondKey" : nil]
]

let x = "someKey"
let y = "someOtherKey"
var foo = 0

if let goo = dict[x]?[y] { foo = goo } //<-- Error: cannot assign (Int?) to Int

if let goo = dict[x]?[y], let boo = goo { foo = boo } //<-- OK


In the first 'if let', goo is returned as an Int? - goo then needs to be unwrapped as in the second 'if let'...



What is the correct syntax for doing this in one step?







swift dictionary unwrap






share|improve this question













share|improve this question











share|improve this question




share|improve this question










asked Nov 23 '18 at 4:24









Andrew CoadAndrew Coad

1098




1098













  • if let goo = dict[x]?[y] ?? NSNotFound { foo = goo } ?

    – Michael Dautermann
    Nov 23 '18 at 4:32











  • This gives the correct result when both keys are valid (e.g. x = "parentKey, y = "firstKey" or y = "secondKey". However, it gives an incorrect result when either x or y is a non-existent key (e.g. x = "someKey" or y = "someOtherKey")

    – Andrew Coad
    Dec 1 '18 at 5:11



















  • if let goo = dict[x]?[y] ?? NSNotFound { foo = goo } ?

    – Michael Dautermann
    Nov 23 '18 at 4:32











  • This gives the correct result when both keys are valid (e.g. x = "parentKey, y = "firstKey" or y = "secondKey". However, it gives an incorrect result when either x or y is a non-existent key (e.g. x = "someKey" or y = "someOtherKey")

    – Andrew Coad
    Dec 1 '18 at 5:11

















if let goo = dict[x]?[y] ?? NSNotFound { foo = goo } ?

– Michael Dautermann
Nov 23 '18 at 4:32





if let goo = dict[x]?[y] ?? NSNotFound { foo = goo } ?

– Michael Dautermann
Nov 23 '18 at 4:32













This gives the correct result when both keys are valid (e.g. x = "parentKey, y = "firstKey" or y = "secondKey". However, it gives an incorrect result when either x or y is a non-existent key (e.g. x = "someKey" or y = "someOtherKey")

– Andrew Coad
Dec 1 '18 at 5:11





This gives the correct result when both keys are valid (e.g. x = "parentKey, y = "firstKey" or y = "secondKey". However, it gives an incorrect result when either x or y is a non-existent key (e.g. x = "someKey" or y = "someOtherKey")

– Andrew Coad
Dec 1 '18 at 5:11












3 Answers
3






active

oldest

votes


















1














As far as I understood you want to force unwrap a double optional. There different methods.



let dbOpt = dict[x]?[y]


My favorite:



if let goo = dbOpt ?? nil { foo = goo } 


Using flatMap:



if let goo = dbOpt.flatMap{$0} { foo = goo } 


Using pattern matching:



if case let goo?? = dbOpt { foo = goo }





share|improve this answer
























  • if let goo = dict[x]?[y] ?? nil { foo = goo } - this works. Thanks...

    – Andrew Coad
    Dec 1 '18 at 5:19



















1














Use nil colesecing and provide a default value. Only way to safely unwrap a dictionary value.



if let goo = dict[x]?[y] ?? NSNotFound { foo = goo }  





share|improve this answer
























  • See comment above for Michael Dauterman's answer

    – Andrew Coad
    Dec 1 '18 at 5:11



















0














There are many ways to do this but one of the simplest solution available is :



var foo = 0

if let goo = dict[x]?[y] as? Int{
foo = goo
}
print(foo)





share|improve this answer
























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53440636%2fhow-to-unwrap-an-optional-dictionary-value-in-swift-4-in-one-step%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    3 Answers
    3






    active

    oldest

    votes








    3 Answers
    3






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    1














    As far as I understood you want to force unwrap a double optional. There different methods.



    let dbOpt = dict[x]?[y]


    My favorite:



    if let goo = dbOpt ?? nil { foo = goo } 


    Using flatMap:



    if let goo = dbOpt.flatMap{$0} { foo = goo } 


    Using pattern matching:



    if case let goo?? = dbOpt { foo = goo }





    share|improve this answer
























    • if let goo = dict[x]?[y] ?? nil { foo = goo } - this works. Thanks...

      – Andrew Coad
      Dec 1 '18 at 5:19
















    1














    As far as I understood you want to force unwrap a double optional. There different methods.



    let dbOpt = dict[x]?[y]


    My favorite:



    if let goo = dbOpt ?? nil { foo = goo } 


    Using flatMap:



    if let goo = dbOpt.flatMap{$0} { foo = goo } 


    Using pattern matching:



    if case let goo?? = dbOpt { foo = goo }





    share|improve this answer
























    • if let goo = dict[x]?[y] ?? nil { foo = goo } - this works. Thanks...

      – Andrew Coad
      Dec 1 '18 at 5:19














    1












    1








    1







    As far as I understood you want to force unwrap a double optional. There different methods.



    let dbOpt = dict[x]?[y]


    My favorite:



    if let goo = dbOpt ?? nil { foo = goo } 


    Using flatMap:



    if let goo = dbOpt.flatMap{$0} { foo = goo } 


    Using pattern matching:



    if case let goo?? = dbOpt { foo = goo }





    share|improve this answer













    As far as I understood you want to force unwrap a double optional. There different methods.



    let dbOpt = dict[x]?[y]


    My favorite:



    if let goo = dbOpt ?? nil { foo = goo } 


    Using flatMap:



    if let goo = dbOpt.flatMap{$0} { foo = goo } 


    Using pattern matching:



    if case let goo?? = dbOpt { foo = goo }






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Nov 23 '18 at 5:20









    AndreaAndrea

    19.9k968107




    19.9k968107













    • if let goo = dict[x]?[y] ?? nil { foo = goo } - this works. Thanks...

      – Andrew Coad
      Dec 1 '18 at 5:19



















    • if let goo = dict[x]?[y] ?? nil { foo = goo } - this works. Thanks...

      – Andrew Coad
      Dec 1 '18 at 5:19

















    if let goo = dict[x]?[y] ?? nil { foo = goo } - this works. Thanks...

    – Andrew Coad
    Dec 1 '18 at 5:19





    if let goo = dict[x]?[y] ?? nil { foo = goo } - this works. Thanks...

    – Andrew Coad
    Dec 1 '18 at 5:19













    1














    Use nil colesecing and provide a default value. Only way to safely unwrap a dictionary value.



    if let goo = dict[x]?[y] ?? NSNotFound { foo = goo }  





    share|improve this answer
























    • See comment above for Michael Dauterman's answer

      – Andrew Coad
      Dec 1 '18 at 5:11
















    1














    Use nil colesecing and provide a default value. Only way to safely unwrap a dictionary value.



    if let goo = dict[x]?[y] ?? NSNotFound { foo = goo }  





    share|improve this answer
























    • See comment above for Michael Dauterman's answer

      – Andrew Coad
      Dec 1 '18 at 5:11














    1












    1








    1







    Use nil colesecing and provide a default value. Only way to safely unwrap a dictionary value.



    if let goo = dict[x]?[y] ?? NSNotFound { foo = goo }  





    share|improve this answer













    Use nil colesecing and provide a default value. Only way to safely unwrap a dictionary value.



    if let goo = dict[x]?[y] ?? NSNotFound { foo = goo }  






    share|improve this answer












    share|improve this answer



    share|improve this answer










    answered Nov 23 '18 at 4:38









    SirCJSirCJ

    187210




    187210













    • See comment above for Michael Dauterman's answer

      – Andrew Coad
      Dec 1 '18 at 5:11



















    • See comment above for Michael Dauterman's answer

      – Andrew Coad
      Dec 1 '18 at 5:11

















    See comment above for Michael Dauterman's answer

    – Andrew Coad
    Dec 1 '18 at 5:11





    See comment above for Michael Dauterman's answer

    – Andrew Coad
    Dec 1 '18 at 5:11











    0














    There are many ways to do this but one of the simplest solution available is :



    var foo = 0

    if let goo = dict[x]?[y] as? Int{
    foo = goo
    }
    print(foo)





    share|improve this answer




























      0














      There are many ways to do this but one of the simplest solution available is :



      var foo = 0

      if let goo = dict[x]?[y] as? Int{
      foo = goo
      }
      print(foo)





      share|improve this answer


























        0












        0








        0







        There are many ways to do this but one of the simplest solution available is :



        var foo = 0

        if let goo = dict[x]?[y] as? Int{
        foo = goo
        }
        print(foo)





        share|improve this answer













        There are many ways to do this but one of the simplest solution available is :



        var foo = 0

        if let goo = dict[x]?[y] as? Int{
        foo = goo
        }
        print(foo)






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 23 '18 at 10:25









        nikksindianikksindia

        472412




        472412






























            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53440636%2fhow-to-unwrap-an-optional-dictionary-value-in-swift-4-in-one-step%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            How to change which sound is reproduced for terminal bell?

            Can I use Tabulator js library in my java Spring + Thymeleaf project?

            Title Spacing in Bjornstrup Chapter, Removing Chapter Number From Contents