Register a SA Forums Account here!
JOINING THE SA FORUMS WILL REMOVE THIS BIG AD, THE ANNOYING UNDERLINED ADS, AND STUPID INTERSTITIAL ADS!!!

You can: log in, read the tech support FAQ, or request your lost password. This dumb message (and those ads) will appear on every screen until you register! Get rid of this crap by registering your own SA Forums Account and joining roughly 150,000 Goons, for the one-time price of $9.95! We charge money because it costs us money per month for bills, and since we don't believe in showing ads to our users, we try to make the money back through forum registrations.
 
  • Post
  • Reply
commie kong
Mar 7, 2019


Adbot
ADBOT LOVES YOU

take boat
Jul 8, 2006
boat: TAKEN

Pulcinella posted:

Yeah Interface Builder works great if you are just using it to grey box the UI layout (I actually really, really like Interface Builder, merge conflicts aside, and it feels very fast to layout complicated hierarchies to me). IBInspectable and IBdesignable never really worked very well, in my experience, and we generally avoid them. IBDesignable is amazing feels like magic…when it works. The problem is IBdesignable views can potentially take a lot of code work to setup properly, work that is usually specific to functioning in IB and isn’t actually needed for the app to work properly. Also sometimes you do everything perfect and they still break anyway.

yep that's about my conclusion as well. Interface Builder is great when there's only one person making changes at a time, but is unworkable beyond that so every large team wants to get rid of them except for fringe features. in my experience IBInspectable was fine, but IBDesignable definitely was not the last time I tried, even with a small project. SwiftUI previews are somehow even worse than I remember with IBDesignable

I have to wonder what it's like at Apple, given they're building these tools and are also the largest iOS developer in the world. they must not use them internally for their major apps?


I'm really excited for this, I hope they do more backwards compatibility in the future. (I realize this is Swift and not a framework feature but still). probably a long shot, but it gets old waiting 2-3 years to use the latest and greatest

commie kong
Mar 7, 2019

Does anyone else follow point-free?

I've been enjoying their videos and the helpers/tools they develop seem very useful and cool. They're all open source on GitHub.

They have probably the best explanatory video and coding presentation style I've seen. They explain issues, the naive solutions (that I find on other sites lol) and their shortcomings. Then they come up with magic to solve them.

Their latest is part of an ongoing series on SwiftUI navigation: https://www.pointfree.co/episodes/ep166-swiftui-navigation-links-part-2#t1623

point-free posted:

So, this is all looking really promising. We have an incredible amount of power in deep linking and testing in our application. When we first started discussing navigation links earlier in this episode we mentioned that they are the most prototypical form of navigation, but also at the same time the most “complicated.”

However, we just introduced a pretty complex navigation link for editing an item, and even showed how we could gate the navigation based on asynchronous effects. This is some of the most complicated navigation you can do in an iOS application, and not only did we accomplish it pretty quickly, but we also got deep linking for free along the way. To contrast with modal sheets and popovers, it took us three very long episodes to develop the techniques that allowed us to model them in state and support deep linking.

Perhaps this form of navigation isn’t so complicated after all?

Well, it definitely is, but it’s come much easier to us thanks to all of the tools we built in previous episodes. The only reason we are able to model our navigation routes as a simple enum and implement a NavigationLink initializer that transforms binding of optionals into bindings of honest values is thanks to all the binding transformation helpers we have defined in past episodes.

So, we’re starting to see that by putting in a little bit of upfront work to try to put structs and enums on the same footing when it comes to binding transformational operators, we unlock powerful tools that help make navigation in SwiftUI a breeze. Just as dynamic member lookup allows us to slice of a binding for a piece of sub-state and hand it off to a child component, the .case transformation allows us to slice off a binding for a particular case of an enum and hand it off to a child component. And when you combine that with navigation tools such as sheets, popovers, and links, you instantly unlock the ability to drive navigation off of state.

The catch is a pricy subscription required to watch more than one video: $18 per month.

My account has a referral code that gives us both a free month. I could post it in coupons or something? Not sure if referrals also get codes.


I was also curious if anyone had opinions on/heard of their Composable Architecture?

https://github.com/pointfreeco/swift-composable-architecture

https://forums.swift.org/c/related-projects/swift-composable-architecture/

take boat
Jul 8, 2006
boat: TAKEN
if you're at all familiar with React Redux, that's a good way to answer whether you'll enjoy that approach to state management and action dispatch. I can't say much for Composable Architecture specifically though

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.
I remember they had a seemingly nice way to handle "dependency injection" that was appealing, but I haven't actually used it. Came across it in the Xcodes.app source.

KidDynamite
Feb 11, 2005

I was looking for a solutions to asynchronous image loading in table views for an interview take home where you can’t use frameworks and came across an apple solution to it. https://developer.apple.com/documentation/uikit/views_and_controls/table_views/asynchronously_loading_images_into_table_and_collection_views

I’m entirely confused by the table view code. When did that shift come about? I feel like I need to go back and learn some things.

Also good lord is there a lot of stuff you don’t really think about when you’re in an already built app with an established code base and use frameworks.

Do y’all keep like an architecture skeleton repo around to help with setting up new apps? I don’t really make apps from scratch often.

haveblue
Aug 15, 2005



Toilet Rascal
Looks like diffable data source showed up in 13 and cell content configuration in 14

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.
Yep it's pretty recent, possibly only a month old if you maintain "current iOS version minus two" compatibility.

KidDynamite posted:

Do y’all keep like an architecture skeleton repo around to help with setting up new apps? I don’t really make apps from scratch often.

I intentionally don't so that I'm more likely to run into new things. I might decide that I dislike the new things and pull in old stuff, but I'd rather it be a conscious choice than the default.

Data Graham
Dec 28, 2009

📈📊🍪😋



KidDynamite posted:

I was looking for a solutions to asynchronous image loading in table views for an interview take home where you can’t use frameworks and came across an apple solution to it. https://developer.apple.com/documentation/uikit/views_and_controls/table_views/asynchronously_loading_images_into_table_and_collection_views

I’m entirely confused by the table view code. When did that shift come about? I feel like I need to go back and learn some things.

Also good lord is there a lot of stuff you don’t really think about when you’re in an already built app with an established code base and use frameworks.

Do y’all keep like an architecture skeleton repo around to help with setting up new apps? I don’t really make apps from scratch often.

A friend of mine is trying to Learn To Code from absolute scratch, using the iPad-centric Swift Playgrounds stuff. He thinks he's going to be able to write iOS apps. I don't have the slightest clue how to tell him as gently and patiently as possible that between "hello world" in Swift and "writing an iOS app" is about ten years of breakneck dedication and painful trial and error. *I* have no idea how one would start a Swift app from scratch without a framework or a tutorial or a demo app to modify. It's not just taking a basic script and adding bits and bobs to it, it's controllers and delegates and wrestling with Xcode and a mountain of weird poo poo that doesn't even sound like English. (Never mind Obj-C.) I've been coding basically my whole adult life and I can barely get my head around it.

xzzy
Mar 5, 2009

That's been my experience as well. I'm not "a developer" but I've done hobbyist grade programming for 25 years and it's been a big struggle figuring out xcode and swift.

A couple weeks ago I got this itch for an app that I figured was small enough in scope that I could pull it off and getting anywhere has been agony. All documentation assumes you're already familiar with every component of ios development so there's a huge chicken/egg problem. Tutorials or code samples are problematic too because they're always 3+ years old and refuse to compile because of regularly shifting requirements in xcode so there's a big rabbit hole of googling the error and getting sucked into documentation that loops back to my first complaint.

Data Graham
Dec 28, 2009

📈📊🍪😋



And/or it'll be a youtube video by a 12-year-old kid who just says like "See all you do is you lay out your view classes and assign delegates and link them together like this, and drag a button onto the storyboard and click here and now there's a function linked to it, then click here and here and here and then your app is done, it's so easy" and I'm like how did I get this old

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

xzzy posted:

Tutorials or code samples are problematic too because they're always 3+ years old and refuse to compile because of regularly shifting requirements in xcode so there's a big rabbit hole of googling the error and getting sucked into documentation that loops back to my first complaint.

WWDC videos too, for the same reasons. (I mention it just to make sure you you check them out too. And there are some intro/summary sessions on various topics each year so it's not just a firehose of new stuff.)

But yeah it's a slog. Better if you have someone or somewhere to ask for help. This thread is always open, no question too small!

awesomeolion
Nov 5, 2007

"Hi, I'm awesomeolion."

Something I didn't realize about WWDC videos is often the first session on a topic contains an introduction and definitions. So if you want to learn about eg. Core Data, you don't want the latest videos. You want the first one from 2016 or whatever because it explains wtf Core Data actually is and the main concepts. The latest videos assume you know everything up to that point which is basically the problem you're describing.

Also I completely agree the Apple docs are mostly dog poo poo, I find them useful mainly if I've used the thing before as a refresher.

Apple sample projects are a good place to find actual examples.

duck monster
Dec 15, 2004

take boat posted:

ha, this was with autolayout? was layout slow at runtime with all that?

Surprisingly, no. It ran quite nicely. It was just evil to work with. I'm assuming that however the editor worked, the actual compiled result worked differently.

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed


It seems that the Swift compiler does not give up after a large number of errors. Unsurprisingly Xcode does not like trying to display 4k errors in one file.

KidDynamite
Feb 11, 2005

only 5 warnings though!

eschaton
Mar 7, 2007

Don't you just hate when you wind up in a store with people who are in a socioeconomic class that is pretty obviously about two levels lower than your own?
too many errors in one file (make fewer)

Data Graham
Dec 28, 2009

📈📊🍪😋



(I know, I'm just trying to annoy you)

Pulcinella
Feb 15, 2019
Probation
Can't post for 10 days!

Data Graham posted:

A friend of mine is trying to Learn To Code from absolute scratch, using the iPad-centric Swift Playgrounds stuff. He thinks he's going to be able to write iOS apps. I don't have the slightest clue how to tell him as gently and patiently as possible that between "hello world" in Swift and "writing an iOS app" is about ten years of breakneck dedication and painful trial and error. *I* have no idea how one would start a Swift app from scratch without a framework or a tutorial or a demo app to modify. It's not just taking a basic script and adding bits and bobs to it, it's controllers and delegates and wrestling with Xcode and a mountain of weird poo poo that doesn't even sound like English. (Never mind Obj-C.) I've been coding basically my whole adult life and I can barely get my head around it.

Ehh that’s literally what I did. Worked full time as a teacher then at night learned Swift through the iPad Swift Playgrounds app. Then followed Apples “learn iOS programming” tutorial (basically one of the last things to be updated on their documentation archive website before they put up a message saying they weren’t maintaining that anymore. I agree that Apple’s documentation is bad. E.g. They have all these in depth documentation guides for things like Collection View layouts that were never even updated for Swift). Total time from knowing nothing to having an app on the store was probably 2 years, and that was only because I could do it in my feee time. Of course, it helped that I was incredibly motivated to GTFO of teaching.

I do agree it helps to have existing code to use as an external brain so you don’t always have to remember the many, many bits of trivia and gotchas. (E.g. self sizing cells, dynamic type, location/notification permissions, how to set scroll view constraints so autolayout doesn’t complain at you or have everything collapse to zero, etc.)

Also agree that the non-code (and even non-interface builder) parts of XCode can be very unfriendly. Provisioning profiles, certs and signing, build phases, capabilities, adding external frameworks/libraries, etc. edit: Oh also app extensions. I don’t think I’ve ever been able to get one to attach to the Xcode debugger, even in the simulator.

Pulcinella fucked around with this message at 19:42 on Nov 24, 2021

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

Pulcinella posted:

Oh also app extensions. I don’t think I’ve ever been able to get one to attach to the Xcode debugger, even in the simulator.

Probably already tried this, but changing the extension's scheme to "wait for the executable to be launched", mashing Run in Xcode, then doing whatever on the device or in simulator to launch the extension works best for me. Definitely finicky though.

Good Sphere
Jun 16, 2018

I'm trying to make an unsafeMutablePointer with a context, and I'm getting the error "No exact matches in call to initializer". Not sure what is going on here. I’m doing this in part to draw individual pixels onto a CGContext.

code:
let context = UIGraphicsGetCurrentContext()

var pixels:Any?

if let data = context?.data
{
  pixels = UnsafeMutablePointer<CUnsignedChar>(data) // No exact matches in call to initializer
}

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

Good Sphere posted:

I'm trying to make an unsafeMutablePointer with a context, and I'm getting the error "No exact matches in call to initializer". Not sure what is going on here. I’m doing this in part to draw individual pixels onto a CGContext.

code:
let context = UIGraphicsGetCurrentContext()

var pixels:Any?

if let data = context?.data
{
  pixels = UnsafeMutablePointer<CUnsignedChar>(data) // No exact matches in call to initializer
}

I think you want something like data.assumingMemoryBound(to: UInt8.self)?

Good Sphere
Jun 16, 2018

pokeyman posted:

I think you want something like data.assumingMemoryBound(to: UInt8.self)?

Thanks, that looks more like it. I used CUnsignedChar for the type of memory.

pixels = data.assumingMemoryBound(to: CUnsignedChar.self)

Now my problem is that I can not get my cgContext data, because it is always nil, even though I am drawing to it with the built in functions of drawing lines, circles or rectangles.

code:
if(pixels == nil){

	if let data = ctx.data
	{
		pixels = data.assumingMemoryBound(to: CUnsignedChar.self) // breakpoint never lands here, even when I call this on a timer. 
	}
}

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

Good Sphere posted:

Thanks, that looks more like it. I used CUnsignedChar for the type of memory.

pixels = data.assumingMemoryBound(to: CUnsignedChar.self)

Now my problem is that I can not get my cgContext data, because it is always nil, even though I am drawing to it with the built in functions of drawing lines, circles or rectangles.

code:
if(pixels == nil){

	if let data = ctx.data
	{
		pixels = data.assumingMemoryBound(to: CUnsignedChar.self) // breakpoint never lands here, even when I call this on a timer. 
	}
}

Where are you getting the context from? I'm at the edge of what I remember, but I think if you create a bitmap context (with or without a buffer passed in) you should end up with a buffer after creating the context. If iOS is passing you the context, I don't know that you can assume anything.

Good Sphere
Jun 16, 2018

pokeyman posted:

Where are you getting the context from? I'm at the edge of what I remember, but I think if you create a bitmap context (with or without a buffer passed in) you should end up with a buffer after creating the context. If iOS is passing you the context, I don't know that you can assume anything.

I'm getting it from a SwiftUI Canvas, which is probably weird, but I can draw onto it using the built in functions, just not this way because cgContext.data is never non-nil.

code:
TimelineView(.periodic(from: .now, by:0.1)) { timeline in
				
	Canvas { context, size in
		let _ = timeline.date.timeIntervalSinceReferenceDate
		context.withCGContext { cgContext in
			drawScreen(ctx:cgContext)
		}
	}
	.zIndex(1)
	.frame(width: defaults.canvasSize.w, height: defaults.canvasSize.h)
}

Good Sphere
Jun 16, 2018

Well I've got something. It does not clear the screen like it does for the other stuff, oddly. Maybe because it's a different context, and I'm confused about how they work exactly.

This is how I set it up:

code:
let colorSpace:CGColorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo: UInt32 = CGImageAlphaInfo.premultipliedLast.rawValue & CGBitmapInfo.alphaInfoMask.rawValue

let canvasWidth = Int(defaults.canvasSize.w)
let canvasHeight = Int(defaults.canvasSize.h)
var bytesPerRow = canvasWidth * 4

let pixels = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: (canvasWidth *  canvasHeight)*4)

let pixelContext = CGContext
(
data: pixels,
width: canvasWidth,
height: canvasHeight,
bitsPerComponent: 8,
bytesPerRow: bytesPerRow,
space: colorSpace,
bitmapInfo: bitmapInfo
)
Notice my pixels capacity. This is different than how I've seen it set up in other examples. It's usually just canvas width * height, but when I was changing the pixel data, I saw it was going beyond the array size, so I had to multiply it by 4 like I did for the bytesPerRow.

setPixelWhiteColor is where I edit the pixel data. putImageData is where I draw it. I make an image from pixelContext, but I draw it onto the passed context, which is the visible Canvas context. Not sure if that makes sense or not. May not, since it clears the screen for circles and stuff, but not my edited pixels. I have made sure it clears the screen before editing the pixelContext data.

code:
func setPixelWhiteColor(whiteLevel:UInt8,atPoint:CGPoint)
{
	let r = whiteLevel
	let g = whiteLevel
	let b = whiteLevel
	let off:Int = Int((atPoint.y * defaults.canvasSize.w + atPoint.x) * 4);

	pixels[off] = r
	pixels[off + 1] = g
	pixels[off + 2] = b
	pixels[off + 3] = 255

}

func putImageData(ctx:CGContext)
{

	let image = pixelContext?.makeImage()
	let rect = CGRect(x: 0, y: 0, width: defaults.canvasSize.w, height: defaults.canvasSize.h)
	if let image = image {
		ctx.draw(image, in: rect)
	}
	
}

Good Sphere fucked around with this message at 07:11 on Dec 15, 2021

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.
Ah ok, I wouldn’t be shocked if SwiftUI is doing something funky and giving you a context that refuses to expose its buffer via the data getter. But blitting your own buffer over seems legit to me?

Good Sphere
Jun 16, 2018

pokeyman posted:

Ah ok, I wouldn’t be shocked if SwiftUI is doing something funky and giving you a context that refuses to expose its buffer via the data getter. But blitting your own buffer over seems legit to me?

Yeah it seems to be okay. I have a huge problem with speed now. My original prototype in Javascript runs fast. It has some optimizations, but still does an upwards of 300,000+ loops or more per render. This is unacceptable on the iOS end, at least for how I have it implemented. And it's not the amount of draws it performs. I've tested by commenting out all drawing, and the performance is about the same. It's a double for loop running on every pixel coordinate to run a distance formula (and skipping that it is optimized for), plus any other loops it needs to perform. Without the optimizations, the amount of loops would be 3 to 4 million.

Pulcinella
Feb 15, 2019
Probation
Can't post for 10 days!

Good Sphere posted:

Yeah it seems to be okay. I have a huge problem with speed now. My original prototype in Javascript runs fast. It has some optimizations, but still does an upwards of 300,000+ loops or more per render. This is unacceptable on the iOS end, at least for how I have it implemented. And it's not the amount of draws it performs. I've tested by commenting out all drawing, and the performance is about the same. It's a double for loop running on every pixel coordinate to run a distance formula (and skipping that it is optimized for), plus any other loops it needs to perform. Without the optimizations, the amount of loops would be 3 to 4 million.

Are you running an optimized release build? Also, I wouldn’t be surprised if SwiftUI has some weird performance issues. I have run into problems where drag gestures were causes huge framerate drops while programmatic scrolling does not because dragging was somehow causing a navigation bar to set an isEditing state property (there is no editing on this screen) and triggering a full screen diff to happen multiple times a frame. You could try in UIKit land.

Also, the new Swift Playgrounds for iPad is out now. The one that lets you upload apps to the App Store. It’s very much an XCode Lite (emphasis on lite). It has its own file format and it doesn’t seem you can convert existing Xcode projects to it. It does support UIKit but no Interface Builder. So I guess all you programmatic layout lovers got the last laugh because it can’t even import xib and storyboard files for the compilation process, let alone actually display them.

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed
I'm very excited to see Apple introducing appstore-only bugs to your app via bitcode move from a theoretical problem to an actual problem. What a wonderful feature.

Good Sphere
Jun 16, 2018

Pulcinella posted:

Are you running an optimized release build? Also, I wouldn’t be surprised if SwiftUI has some weird performance issues. I have run into problems where drag gestures were causes huge framerate drops while programmatic scrolling does not because dragging was somehow causing a navigation bar to set an isEditing state property (there is no editing on this screen) and triggering a full screen diff to happen multiple times a frame. You could try in UIKit land.

Also, the new Swift Playgrounds for iPad is out now. The one that lets you upload apps to the App Store. It’s very much an XCode Lite (emphasis on lite). It has its own file format and it doesn’t seem you can convert existing Xcode projects to it. It does support UIKit but no Interface Builder. So I guess all you programmatic layout lovers got the last laugh because it can’t even import xib and storyboard files for the compilation process, let alone actually display them.

Building for release, and you're right about Canvas not running well in Swift UI, according to the million complaints I see out there.

e: Actually, I'm still conflicted by this, because I tested it without drawing anything, and it looks like the slowdown really happens inside my loop. I also recently found out that my double-for loop replaced with a double while runs a bit faster. I can also skip ahead in the while if I find that running through it is unnecessary, even if continuing after every iteration.

Good Sphere fucked around with this message at 05:07 on Dec 17, 2021

uncle blog
Nov 18, 2012

In SwiftUI i have a fullscreen view with a buch of other views in a VStack. One of the things is a List. Right now it is taking up all available space (even though it only contains a couple of items) and pushes everything below to the end of the parent view. Is this normal behavior? Any way to make it only take up the space it needs to fit its content?

Small White Dragon
Nov 23, 2007

No relation.
Having a discussion with another dev, Google has not been as helpful as I'd hoped, so figured I'd see if folks know --

If my MacOS app needs some .dylibs -- not entire frameworks, just single compiled libraries -- where are these supposed to go in the app bundle?

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.

Small White Dragon posted:

Having a discussion with another dev, Google has not been as helpful as I'd hoped, so figured I'd see if folks know --

If my MacOS app needs some .dylibs -- not entire frameworks, just single compiled libraries -- where are these supposed to go in the app bundle?

I think the technical answer is a combination of "somewhere in a run-path search path", which https://developer.apple.com/library...tLibraries.html has a bit of info about in the last section, and "somewhere in your app's bundle", per https://developer.apple.com/library/archive/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919-CH1-TNTAG207

If you're wondering about a specific path within your app bundle (like Cool.app/Frameworks vs. Cool.app/Vendor or whatever) then I don't know if there's official guidance. I'd make a new Xcode project from a template, drag a .dylib in to the "embedded libraries" section of the app target, and see where it ends up in the built .app.

Small White Dragon
Nov 23, 2007

No relation.
The reason this came up is that it seems like the behavior is different in Monterey than previous OS releases... for whatever reason.

I HAVE GOUT
Nov 23, 2017
I have an OSX app I want to be running during the workday, but only during roughly 9-5 on weekdays. Is there a LaunchDaemon setup I can do for this? The program also crashes a lot, so its not something I can use crons to boot at the beginning of the day and kill at the end.

eschaton
Mar 7, 2007

Don't you just hate when you wind up in a store with people who are in a socioeconomic class that is pretty obviously about two levels lower than your own?

Small White Dragon posted:

Having a discussion with another dev, Google has not been as helpful as I'd hoped, so figured I'd see if folks know --

If my MacOS app needs some .dylibs -- not entire frameworks, just single compiled libraries -- where are these supposed to go in the app bundle?

I think most people just put them in Contents/Frameworks alongside their embedded frameworks. That way the default runpath search path of @executable_path/../Frameworks will find them as well.

So far as I know, there haven’t been any changes in this area in macOS 12.

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed
macOS 12 did change something. We had to switch from setting LD_LIBRARY_PATH to DYLD_LIBRARY_PATH in a few spots, and one of our tests was putting dylibs in a blatantly incorrect place that worked until macOS 12 for unclear reasons. I'm guessing something was rewritten and maintained the same documented behavior but unsurprisingly broke some things which weren't intended to work but previously happened to.

commie kong
Mar 7, 2019

All you pros going to be switching to iPads for development now?

Hacking with swift newsletter posted:

Swift Playgrounds 4 is out!

At WWDC21 Apple promised a massive update for Swift Playgrounds 4, and they really lived up to that promise – I’ve been using it extensively to build SwiftUI apps, and it’s a ton of fun.

I wrote a full review of Playgrounds 4 here, but in case you’re short on time here’s the least you need to know:

  • Yes, you can now build SwiftUI apps right on your iPad.
  • Yes, you can use also UIKit if you prefer.
  • Yes, you can ship your apps to the App Store straight from your iPad.
  • Yes, it supports Swift Package Manager packages from GitHub.
    Yes, you get the fantastic new code completion, just like with Xcode.
  • Yes, it ships with Swift 5.5 and all the concurrency awesomeness that entails.

PS: If you'd like a tutorial on how to build your first app with Swift Playgrounds 4, I've got you covered right here.

Adbot
ADBOT LOVES YOU

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed

commie kong posted:

Yes, you get the fantastic new code completion, just like with Xcode.

Which is it? Fantastic, or just like Xcode? Those are pretty contradictory.

  • 1
  • 2
  • 3
  • 4
  • 5
  • Post
  • Reply