And of course you need to be on the bug riddled Catalina to get any real SwiftUI development done (live previews).
UI development in the Apple ecosystem has always been a bit rough, but I've never run into _this_ many problems in such a short amount of time, all while following their official tutorial.
Real shame too. I've talked about this with some of their tools team I went to school with. I don't know what's in the water in Cupertino but I don't think Apple devs are getting the same experience out of XCode as their actual users.
This was complex and somewhat tricky to get right, which is why sometimes you see errors that seemingly have nothing to do with the original problem. Closures and generics were especially problematic for the old design to deal with.
Since Swift 4.2 there has been an ongoing effort to rewrite diagnostics so that the solver keeps enough breadcrumbs from failed constraints to piece together an accurate error message. On the master branch the type checker’s test suite has lots of examples where diagnostics have improved significantly.
Rumors are this was pushed out this year in order to respond to Catalyst’s public unveiling. Word is there was a little internal politics over what is the “preferred” method for apps on the Mac.
At least, that’s what I have seen on Twitter. Personally, I think it was mainly about wanting to get the Swift features in place to support it and since Swift is largely evolved and developed in the public it needed to come sooner, rather than later.
Edits: typos
Many parts of the SwiftUI documentation are still marked [Beta] for all OSes. Or maybe it's just saying that the documentation is beta, though it's more like Alpha..
EDIT: Apparently it says Beta only in the offline docs on Xcode 11.1 (not sure about 11.2)
It is not, aside from a smattering of pages I am assuming that have not been updated: https://developer.apple.com/documentation/swiftui
Whereas the web version doesn't have the beta tag: https://developer.apple.com/documentation/swiftui/text
We're starting on a major rewrite of the Redux core docs [1], and as part of that we'll be encouraging folks to use RSK as the default way to write Redux code.
(Note that we're also discussing possibly renaming RSK [2] to avoid confusion over the word "Starter" - a lot of folks are mistaking this to mean that it's only good for beginners or that it's some kind of project CLI tool.)
[0] https://redux-starter-kit.js.org
...and this thread where two interested parties discuss SwiftUI briefly:
https://twitter.com/raphlinus/status/1190025792534798338
...and also this blog post: https://raphlinus.github.io/rust/druid/2019/10/31/rust-2020....
There are lots of apps which are simply specialized CRUD apps. Personally, I love building them. The current state of SwiftUI is sufficiently developed for this kind of app.
Best of all I generally have to write most game UI views just once for iOS/macOS (because they won't use native widgets anyway) with a few #if differences.
You'd also be able to use mostly the same code (even for touch and mouse input) on both iOS/macOS without needing to use Catalyst (which brings bugs of its own) :)
- open source code - if something is not clear I can always CTRL + click a widget and see how it's implemented
- there is official formatter for Dart which formats widgets on save (IMO essential things for layout in code)
- documentation is good enough
- it works on any iOS version
- it works on two popular IDEs which support plugins
I had great hopes for flutter, but this kind of cooled me down instantly.
Regarding bugs you have mentioned... I've seen worse stuff, but that's how it is with new technologies.
I also filed a bug about tests in Dart not being able to be code folded properly in IDEA and it was fixed within about a month. The developers of that plugin really take it seriously. Totally awesome.
It's 'new' and it has 'Apple' behind it. I had to google to make sure I wasn't missing something. It's 'declarative', it has 'design tools' and it works on 'apple only platforms' [0]. Are those supposed to be killer features?
There was a twitter question that really made me think - it asked what framework, language or tool of today, would give a competitive advantage, if you had it 15 years ago [1]. I couldn't come up with a single thing, and that was a depressing realization.
Is SwiftUI that tool that will be looked back on in 15 years? Is Swift that language? For me, no. It's not even bloody cross platform...
[0] https://developer.apple.com/xcode/swiftui/ [1] https://twitter.com/tolmasky/status/1183146890293956609?s=20
Being able to target desktop, phone, tablet, and TV devices while reusing 80%-90%* of the same code for all of them, is cross-platform enough for me. :)
macOS, iOS, iPadOS, tvOS, and soon AROS if the rumors have weight, comprise over a billion users. And if you're someone who likes to tinker with the latest tech in your apps, Apple has the best ecosystem because most of their users quickly upgrade to the latest OS, compared to Android etc.
* Ass estimate
What magic are we talking about? I thought all the new stuff was RFC'd right after SwiftUI was announced.
So e.g. you can’t use `some`-typed variables or stored properties.
A `some`-typed variable or stored property wouldn't make any sense because it would be a variable that has a concrete but unknown type. You can't assign something to such a variable, because there's no way to know whether the value you're trying to assign matches the hidden concrete type of the variable.
Perhaps the "automatic type-erasure" feature you're wanting is actually generalized existentials ([1])? Generalized existentials would allow you to declare a variable whose type can be "any Equatable", rather than "some (specific but unknown) Equatable", and the compiler would allow you to "open" the existential and use it like a generic type (without throwing the "protocol can only be used as a generic constraint because it has Self or associatedtype requirements" error).
[0]: https://docs.swift.org/swift-book/LanguageGuide/OpaqueTypes.... [1]: https://github.com/apple/swift/blob/master/docs/GenericsMani...
let strings: some Collection = ["hello", "world"]
[0]https://github.com/apple/swift-evolution/blob/master/proposa...A simple example: [0]. There are workarounds for this specific issue, but trying to do complex stuff sometimes surfaces inscrutable limitations that I can't quite figure out. And with no documentation relevant to a particular case, no Google hits, not even on Apple's forums, and the uncertainty of error messages, I'm not even sure if I'm doing something wrong or it just can't/shouldn't be done. I have to try random things until it works...until it doesn't.
I'm currently experimenting with a SwiftUI layer for a game engine [1], and running into weird undocumented differences between macOS and iOS (like view backgrounds clipping at stack container edges on macOS but not on iOS) that I can't be sure if they're bugs or what. Still, I love SwiftUI.
Also see EmptyView [2]
[0] https://gist.github.com/ShinryakuTako/5a7b32bbf4f4c3874439c2...
[1] https://github.com/InvadingOctopus/octopuskit
[2] https://forums.swift.org/t/how-do-views-like-emptyview-confo...
class ViewContainer<ViewType: View> {
var view: ViewType
init(view: ViewType) {
self.view = view
}
}
extension ViewContainer where ViewType == EmptyView {
convenience init() {
self.init(view: EmptyView())
}
}
With this code, writing `ViewContainer()` will produce a `ViewContainer<EmptyView>`. Writing `ViewContainer<Text>()` will fail with an error (as expected).Note that since this is statically-typed, the following will fail:
let container = ViewContainer()
container.view = Text("wat")
If you want to be able to do that, you'd have to write something like let container = ViewContainer(view: AnyView(EmptyView()))
container.view = AnyView(Text("wat"))But I do need to be able to change the view during runtime, so I settled on just type-erasing to AnyView for now.
Your workaround is to use the AnyView type I guess. Or a conditional with either EmptyView or the template type (displayed).
What would be the name of the feature that allows you to use a default template type if no argument is given to figure out the type to use?
Yes, I made the init generic instead of the type, and made the property an AnyView, but I've read that AnyView may decrease performance (probably because of reasons discussed in this post's article.)
var viewContainer2 = ViewContainer<EmptyView>()
But that's probably not what you want is it. Default generic arguments aren't implemented yet, see (https://stackoverflow.com/questions/42015081/can-i-assign-a-...). It would have possibly removed the <EmptyView> aspect. So you always have to give a type to ViewContainer, if you provide no way for the compiler to infer it.Yes, that would be a workaround for myself, but for a game engine's API, it'd be ugly to require users to write that every time. :)
And there are cases where they might not even know the type.
And it seems I didn't understand your problem, you wanting a variable that can change it's type instead of just some syntactic sugar, hmm.
Or it might be something else.
But how do things like EmptyView work? How do they conform to the View protocol without having a body property (that must also be a View)?
[0]: https://developer.apple.com/documentation/swiftui/emptyview/... [1]: https://developer.apple.com/documentation/swiftui/view/32785...
public struct EmptyView: View {
@inlinable public init()
public typealias Body = Never
}
Because Body is Never, you can't access EmptyView's body property.https://forums.swift.org/t/how-do-views-like-emptyview-confo...
> Thread 1: Fatal error: body() should not be called on EmptyView.
So I don't think the implementation is doing anything beyond the fatalError() call from that forum thread. At least not at this point in time.
1. What the ... ?
2. That's really clever.
3. That's a really bad idea (see 2)You say "nil messaging", I say "pervasive optionals".
You say "autorelease pool", I say "deterministic delayed free".
You say "proxy objects", I say "first class variables".
And all of these aren't particularly clever in the sense of "so incredibly complicated that nobody can figure them out".
Maybe "hacky".
It's a really amazing system, but the sparseness of proper official documentation, Xcode bugs (like marking errors on a line far away from where the problem actually is) and the seemingly secret Swift magic that's used to implement some features, means everyone is stumbling blindly in a labyrinth, relying on each other's shouts to navigate.
Resources like this post and https://swiftui-lab.com and https://mecid.github.io are a godsend.