Comments (7)
In your case, we would recommend you use the extension just like you did. However, I can see how this breaks down with different NSDate
formatters. The reason you are seeing the compiler hang is because the types aren't aligning and making JSONParseUtils.parseURL
take a String?
fixes that.
The expression j <|? "full"
in your code above returns a String??
and the flatMap operator >>-
will only unwrap one level of context. You would have to write that line as <^> j <| "full" >>- JSONParseUtils.parseURL
. The issue now is that you loose your "nil is ok" decoding. To fix that, wrap your entire expression in pure
. This will wrap the result in another optional context and allow for nil
being ok.
<^> pure(j <| "full" >>- JSONParseUtils.parseURL)
I'm going to keep this issue open to make sure an example of this gets added to the docs and/or a test. I think this will change with Argo 1.0.
from argo.
Thanks for the feedback. I'll take a closer look at pure
.
from argo.
@marcelofabri any update on this? did pure
work out for you?
from argo.
I justed tested this, but I couldn't make it work:
struct JSONParseUtils {
static func parseURL(URLString: String?) -> NSURL? {
return flatMap(URLString) { NSURL(string: $0) }
}
}
extension ImagesURLs: Decodable {
static func create(fullImageURL: NSURL?)(mediumImageURL: NSURL?)(thumbImageURL: NSURL?) -> ImagesURLs {
return ImagesURLs(fullImageURL: fullImageURL, mediumImageURL: mediumImageURL, thumbImageURL: thumbImageURL)
}
public static func decode(j: JSON) -> Decoded<ImagesURLs> {
return ImagesURLs.create
<^> pure((j <| "full") >>- JSONParseUtils.parseURL)
<*> pure((j <| "medium") >>- JSONParseUtils.parseURL)
<*> pure((j <| "thumb") >>- JSONParseUtils.parseURL)
}
}
The compiler just gives up:
Expression was too complex to be solved in reasonable time; consider breaking up the expression into distinct sub-expressions
I also didn't understand why you suggested <|
and not <|?
.
from argo.
@marcelofabri Using Argo 1.0+, those operators return a Decoded<T>
now instead of a T?
.
This means that j <| "full"
returns Decoded<String>
. You can use j <|? "full"
to return a Decoded<String?>
.
Then you use flatMap
which expects the type signature to be String? -> Decoded<NSURL?>
.
If you change parseURL
to return a Decoded<NSURL?>
by puring the return and remove the pure
calls in the decode
function, it should align for you.
from argo.
I finally got it! Thanks for the patience and your help.
Here's the final code for future reference:
struct JSONParseUtils {
static func parseURL(URLString: String?) -> Decoded<NSURL?> {
return pure(flatMap(URLString) { NSURL(string: $0) })
}
}
extension ImagesURLs: Decodable {
static func create(fullImageURL: NSURL?)(mediumImageURL: NSURL?)(thumbImageURL: NSURL?) -> ImagesURLs {
return ImagesURLs(fullImageURL: fullImageURL, mediumImageURL: mediumImageURL, thumbImageURL: thumbImageURL)
}
public static func decode(j: JSON) -> Decoded<ImagesURLs> {
return ImagesURLs.create
<^> j <|? "full" >>- JSONParseUtils.parseURL
<*> j <|? "medium" >>- JSONParseUtils.parseURL
<*> j <|? "thumb" >>- JSONParseUtils.parseURL
}
}
from argo.
Awesome! Glad we were able to figure it out! Feel free to comment on here again if a similar thing happens or make new issues if you run into other problems!
from argo.
Related Issues (20)
- error: no such module 'Runes' HOT 7
- Problem with Decodable on xcode 9 HOT 3
- RFC: Renaming the Decodable protocol
- How to decode a "Dictionary" to "[Model]"? HOT 3
- Parse nested array failed HOT 5
- Parse nested model fails when adding a specific key HOT 2
- How to decode dynamic keys HOT 2
- RFC: Renaming (or removing) the `<|` family of operators HOT 5
- Decode type 'Any' HOT 2
- RFC: Make Swift.Decodable conform to Argo.Decodable in Swift 4.1 HOT 4
- Convert all wrong type return JSON to specific type HOT 6
- Decoding the same object with different keys HOT 6
- How to parse an empty dictionary object in Argo HOT 1
- [Question] Array decoding HOT 4
- Using pure can't compile using Swift 3 HOT 2
- Decodable' is ambiguous for type lookup in this context (Swift4) HOT 1
- Parsing a json array with strings and objects intermixed HOT 2
- Xcode 11.0 compatibility issue HOT 3
- Xcode 11.2.1 Binary operator '<^>' cannot be applied to operands of type HOT 7
- Upgrade to version 5.0.0 blocked due to Ogra library HOT 6
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from argo.