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;
}
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
add a comment |
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
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
add a comment |
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
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
swift dictionary unwrap
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
add a comment |
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
add a comment |
3 Answers
3
active
oldest
votes
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 }
if let goo = dict[x]?[y] ?? nil { foo = goo } - this works. Thanks...
– Andrew Coad
Dec 1 '18 at 5:19
add a comment |
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 }
See comment above for Michael Dauterman's answer
– Andrew Coad
Dec 1 '18 at 5:11
add a comment |
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)
add a comment |
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
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
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 }
if let goo = dict[x]?[y] ?? nil { foo = goo } - this works. Thanks...
– Andrew Coad
Dec 1 '18 at 5:19
add a comment |
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 }
if let goo = dict[x]?[y] ?? nil { foo = goo } - this works. Thanks...
– Andrew Coad
Dec 1 '18 at 5:19
add a comment |
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 }
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 }
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
add a comment |
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
add a comment |
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 }
See comment above for Michael Dauterman's answer
– Andrew Coad
Dec 1 '18 at 5:11
add a comment |
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 }
See comment above for Michael Dauterman's answer
– Andrew Coad
Dec 1 '18 at 5:11
add a comment |
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 }
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 }
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
add a comment |
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
add a comment |
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)
add a comment |
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)
add a comment |
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)
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)
answered Nov 23 '18 at 10:25
nikksindianikksindia
472412
472412
add a comment |
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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
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