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
lord funk
Feb 16, 2004

Is there a smart way to know what I'm swift_releasing / swift_retaining here? This is in my draw loop and I want to avoid the overhead.

Only registered members can see post attachments!

Adbot
ADBOT LOVES YOU

Good Sphere
Jun 16, 2018

lord funk posted:

Is there a smart way to know what I'm swift_releasing / swift_retaining here? This is in my draw loop and I want to avoid the overhead.



What does your function look like? Sadly, I ran into some issues I couldn't figure out how to mitigate until I wrapped draw in autoreleasepool.

JawnV6
Jul 4, 2004

So hot ...
im presenting at the thing today, come say hi

rjmccall
Sep 7, 2007

no worries friend
Fun Shoe
I would but I'm on the wrong side of the country.

Good Sphere
Jun 16, 2018

The CIEdges (as well as other CIFilters) are no longer working consistently the same between devices and iOS versions. So I decided to find edges with a convolution filter. Success: I can get a good black and white mask of the images, and let a gradient or solid color show through:



Problem is, I can't figure out a good way to variably adjust the line thickness. One way I tried was to decrease a version of the source image, and apply the convolution and upscale on top of the black and white camera image. That sort of works, but the lines look jaggy and gross. Any ideas? Here's my code:

code:
func sketch(with ciImage: CIImage) -> CIImage {

    var sourceCore = ciImage

    var convolutionValue_A:CGFloat = -0.0925937220454216
    var convolutionValue_B:CGFloat = -0.4166666567325592
    var convolutionValue_C:CGFloat = -1.8518532514572144
    var convolutionValue_D:CGFloat = 0.23148006200790405
    var convolutionValue_E:CGFloat = 4.5833334922790527
    var convolutionValue_F:CGFloat = 14.166666984558105

    var brightnessVal:CGFloat = 1.1041666269302368
    var contrastVal:CGFloat = 3.0555555820465088

    // radially symmetrical convolution weights:
    var weightsArr: [CGFloat] = [
        convolutionValue_A, convolutionValue_A, convolutionValue_B, convolutionValue_B, convolutionValue_B, convolutionValue_A, convolutionValue_A,
        convolutionValue_A, convolutionValue_B, convolutionValue_C, convolutionValue_C, convolutionValue_C, convolutionValue_B, convolutionValue_A,
        convolutionValue_B, convolutionValue_C, convolutionValue_D, convolutionValue_E, convolutionValue_D, convolutionValue_C, convolutionValue_B,
        convolutionValue_B, convolutionValue_C, convolutionValue_E, convolutionValue_F, convolutionValue_E, convolutionValue_C, convolutionValue_B,
        convolutionValue_B, convolutionValue_C, convolutionValue_D, convolutionValue_E, convolutionValue_D, convolutionValue_C, convolutionValue_B,
        convolutionValue_A, convolutionValue_B, convolutionValue_C, convolutionValue_C, convolutionValue_C, convolutionValue_B, convolutionValue_A,
        convolutionValue_A, convolutionValue_A, convolutionValue_B, convolutionValue_B, convolutionValue_B, convolutionValue_A, convolutionValue_A
    ]

    let inputWeights:CIVector = CIVector(values: weightsArr, count: weightsArr.count)

    sourceCore = sourceCore
        .applyingFilter("CIColorControls", parameters: [kCIInputImageKey: sourceCore,
                                                        kCIInputSaturationKey: 0.0,
                                                        kCIInputBrightnessKey: brightnessVal,
                                                        kCIInputContrastKey: contrastVal])

    // transforms image to only show edges in black and white
    sourceCore = sourceCore
        .applyingFilter("CIConvolution7X7", parameters: [kCIInputImageKey: sourceCore,

    let whiteCIColor = CIColor.white
    let whiteColor = CIImage(color: whiteCIColor).cropped(to: ciImage.extent)

    // for some reason, I need to blend the black and white mask with the color white.
    // either CIColorDodgeBlendMode or CILinearDodgeBlendMode seems to work fine here:
    sourceCore = sourceCore
            .applyingFilter("CIColorDodgeBlendMode", parameters: [kCIInputImageKey: sourceCore,
                                                                    kCIInputBackgroundImageKey: whiteColor])
                                                         kCIInputWeightsKey: inputWeights]).cropped(to: sourceCore.extent)

    // give camera image a black and white Noir effect
    var ciImage = ciImage
        .applyingFilter("CIPhotoEffectNoir", parameters: [kCIInputImageKey: ciImage])


    // make solid color
    let color = CIColor(red: 0.819, green: 0.309, blue: 0.309)
    let colFilter = CIFilter(name: "CIConstantColorGenerator")!
    colFilter.setValue(color, forKey: kCIInputColorKey)
    var solidColor = colFilter.value(forKey: "outputImage") as! CIImage
    solidColor = solidColor.cropped(to: ciImage.extent)

    // color is shown through outlines correctly, 
    // and image is black and white
    sourceCore = sourceCore
        .applyingFilter("CIBlendWithMask", parameters: [
            kCIInputImageKey: ciImage, // black and white image
            kCIInputBackgroundImageKey: solidColor, // solid color
            kCIInputMaskImageKey:sourceCore]) // edge work image

    ciImage = sourceCore

    return ciImage

}

JawnV6
Jul 4, 2004

So hot ...

rjmccall posted:

I would but I'm on the wrong side of the country.

I had fun! I, unknowingly, called someone's code bloated to their face. They insinuated I would be replaced by a shell script. Good times!

Good Sphere
Jun 16, 2018

edit 1/21/20: deleting my derivedData folder fixed it.

Anyone know why the command+click "Jump to definition" would jump to the wrong definition in Xcode? Just started happening these last few days. Tried closing/opening project, restarting machine, cleaning build folder.

Good Sphere fucked around with this message at 17:51 on Jan 21, 2020

duck monster
Dec 15, 2004

I've started a new job and inhereted a giant React Native act. Every cell in my body is crying out for the sweet release of death. loving Javascript!

Oh my beloved Swift, we shall meet again, one day. :(

edit: Oh and heres something trippy. You know the 3D view controller inspector thing? Try it on a react native app. Turns out it really is using Native widgets and not skinned up HTML.

go play outside Skyler
Nov 7, 2005


duck monster posted:

I've started a new job and inhereted a giant React Native act. Every cell in my body is crying out for the sweet release of death. loving Javascript!

Oh my beloved Swift, we shall meet again, one day. :(

edit: Oh and heres something trippy. You know the 3D view controller inspector thing? Try it on a react native app. Turns out it really is using Native widgets and not skinned up HTML.

React Native is actually pretty loving good.

Data bindings work really well, and the magical LayoutAnimation.ConfigureNext function does wonders to transition between view states.

JS is not the best language but in my opinion it's universal enough that pretty much any dev can get up and running quickly. And if you hate its perks, you can always transpile from TypeScript.

stuffed crust punk
Oct 8, 2004

by LITERALLY AN ADMIN

duck monster posted:

I've started a new job and inhereted a giant React Native act. Every cell in my body is crying out for the sweet release of death. loving Javascript!

Oh my beloved Swift, we shall meet again, one day. :(

edit: Oh and heres something trippy. You know the 3D view controller inspector thing? Try it on a react native app. Turns out it really is using Native widgets and not skinned up HTML.

Quit

Simulated
Sep 28, 2001
Lowtax giveth, and Lowtax taketh away.
College Slice

go play outside Skyler posted:

React Native is actually pretty loving good.

Data bindings work really well, and the magical LayoutAnimation.ConfigureNext function does wonders to transition between view states.

JS is not the best language but in my opinion it's universal enough that pretty much any dev can get up and running quickly. And if you hate its perks, you can always transpile from TypeScript.

Running animations from a background JS thread does wonderful things for battery life too!

Oh wait, "wonderful" was the wrong word...

go play outside Skyler
Nov 7, 2005


Simulated posted:

Running animations from a background JS thread does wonderful things for battery life too!

Oh wait, "wonderful" was the wrong word...

Not to derail this thread but React Native has had a "useNativeDriver" option for a while now which simply triggers the animation and lets a native background thread handle the rest. It's all about how you use the tool, really.

go play outside Skyler fucked around with this message at 12:35 on Jan 17, 2020

America Inc.
Nov 22, 2013

I plan to live forever, of course, but barring that I'd settle for a couple thousand years. Even 500 would be pretty nice.
Hi everyone. At work it appears we found a nasty issue with building Xcode projects after upgrading to 11.1.

I'm not that experienced with development on Mac, and am more of a back-end, non user-facing developer. However, I have to do work on the front end from time to time and one of our supported front-ends is Mac.

So we have a .pbxproj file for an Xcode project checked into version control. I modified this file on a wip branch - just removing and renaming files - and our CI system then built the project on a dedicated Mac machine. Okay, so what?

The funny thing was, it seemed like CI was building the Xcode project based on the old .pbxproj file. On my repo, it built correctly, and two other people pulled my branch and tried it too, no problem. I tried multiple random things to make the CI build work, but guess what? The CI machine needed to delete its DerivedData folder before building and then it was just fine. I had no access to the CI machines so I couldn't have just logged in to find that out, though admittedly the DerivedData being the problem seems obvious now.

Our CI people had to submit a fix to make the Mac machines always delete DerivedData before doing a build. Meanwhile I dropped my work item for a day while our CI team figured out what was going on and I blew another day before struggling to fix it. I'm not angry about that at all.

So PSA: DerivedData is evil.

America Inc. fucked around with this message at 08:46 on Jan 17, 2020

Doc Block
Apr 15, 2003
Fun Shoe
Bash code:
alias fuxcode='rm -rf ~/Library/Developer/Xcode/DerivedData'
has been in my .profile (or .zprofile now) for as long as Xcode has been using DerivedData

Doc Block fucked around with this message at 10:39 on Jan 17, 2020

Doctor w-rw-rw-
Jun 24, 2008

Simulated posted:

Running animations from a background JS thread does wonderful things for battery life too!

Oh wait, "wonderful" was the wrong word...

I mean, iOS' render server runs out of process...running animations on background threads is a good idea for the kind of programming model JS has, and most simple apps with noninteractive animations.

I personally favor a slightly different model than, but borrowing from, React, which I suspect resembles SwiftUI in some respects, which I'm working on on the side.

Boris Galerkin
Dec 17, 2011

I don't understand why I can't harass people online. Seriously, somebody please explain why I shouldn't be allowed to stalk others on social media!
Does anyone know what the query parameters lsp and _ext for the Apple Maps url scheme are? It's not mentioned in the documentation but they come up if I search for a place in Apple Maps and copy the link.

lsp is a 4 digit integer

_ext is a long string of lower/uppercase characters and symbols

e: I'm also assuming that "auid" is a unique identifier for specific places in Apple Maps?

Simulated
Sep 28, 2001
Lowtax giveth, and Lowtax taketh away.
College Slice

LookingGodIntheEye posted:

Hi everyone. At work it appears we found a nasty issue with building Xcode projects after upgrading to 11.1.

I'm not that experienced with development on Mac, and am more of a back-end, non user-facing developer. However, I have to do work on the front end from time to time and one of our supported front-ends is Mac.

So we have a .pbxproj file for an Xcode project checked into version control. I modified this file on a wip branch - just removing and renaming files - and our CI system then built the project on a dedicated Mac machine. Okay, so what?

The funny thing was, it seemed like CI was building the Xcode project based on the old .pbxproj file. On my repo, it built correctly, and two other people pulled my branch and tried it too, no problem. I tried multiple random things to make the CI build work, but guess what? The CI machine needed to delete its DerivedData folder before building and then it was just fine. I had no access to the CI machines so I couldn't have just logged in to find that out, though admittedly the DerivedData being the problem seems obvious now.

Our CI people had to submit a fix to make the Mac machines always delete DerivedData before doing a build. Meanwhile I dropped my work item for a day while our CI team figured out what was going on and I blew another day before struggling to fix it. I'm not angry about that at all.

So PSA: DerivedData is evil.

Pretty please if you can narrow down the change that caused this I will make sure the right people see it. Did you move types between modules? Add or remove targets? If you can share the code (which I understand many can't) even better.

Simulated
Sep 28, 2001
Lowtax giveth, and Lowtax taketh away.
College Slice

Doctor w-rw-rw- posted:

I mean, iOS' render server runs out of process...running animations on background threads is a good idea for the kind of programming model JS has, and most simple apps with noninteractive animations.

I personally favor a slightly different model than, but borrowing from, React, which I suspect resembles SwiftUI in some respects, which I'm working on on the side.

I was being glib about the fact that no one bothers to even check the perf impact because developer convenience has become the be-all end-all in our industry lately.

Doctor w-rw-rw-
Jun 24, 2008

Simulated posted:

I was being glib about the fact that no one bothers to even check the perf impact because developer convenience has become the be-all end-all in our industry lately.

No, it just survives project cancellations better than big native platforms which can meet that performance bar, but take forever to get good. There's Darwin and then there's Android, and a bunch of dead or never-even-announced platforms strangled in the crib by execs who didn't understand their own strategy.

I'm not bitter or anything...

lord funk
Feb 16, 2004

Is there a way to pop items off of an UndoManager stack without performing them? or to reopen the last closed undo group? I have a case where ending dragging a slider closes an undoGroup, but the slider handle also can be tapped. If the tap is successful (there is a delay for checking), I want to reopen the last group for the next actions to join in.

edit: on second thought, that's probably not the way to do it. reworked things and should be better off now.

lord funk fucked around with this message at 09:00 on Jan 27, 2020

Lumpy
Apr 26, 2002

La! La! La! Laaaa!



College Slice
Does anyone have any good experiences with (or work for a good) iOS / Android dev shop? The company I work for is going to be outsourcing our mobile apps because our team is not large enough and doesn't have enough folks with mobile experience to handle it in-house. The two options brought to our attention so far are https://www.thesmythgroup.com/ and https://www.equalexperts.com/ . Happy to take answers here or in PMs / email (gmail: veddermatic)

If this is inappropriate for this thread, I will edit and ask a dumb iOS question instead =)

awesomeolion
Nov 5, 2007

"Hi, I'm awesomeolion."

Today I made this meme



I'm sure this wouldn't actually work, but after dealing with months of wHiCh eMaiL DiD i uSe tO LOg iN it would be real slick if you could connect user accounts to some encrypted id of their fingerprint and then be like "get user for fingerprint and log em in".

Edit: YOU CAN? https://developer.apple.com/documentation/localauthentication/logging_a_user_into_your_app_with_face_id_or_touch_id

Why don't apps do this? I guess cause most apps have a crappy website you need to be able to login to?

awesomeolion fucked around with this message at 21:28 on Jan 30, 2020

Doctor w-rw-rw-
Jun 24, 2008

awesomeolion posted:

Today I made this meme



I'm sure this wouldn't actually work, but after dealing with months of wHiCh eMaiL DiD i uSe tO LOg iN it would be real slick if you could connect user accounts to some encrypted id of their fingerprint and then be like "get user for fingerprint and log em in".

Edit: YOU CAN? https://developer.apple.com/documentation/localauthentication/logging_a_user_into_your_app_with_face_id_or_touch_id

Why don't apps do this? I guess cause most apps have a crappy website you need to be able to login to?

FaceID & TouchID authorize, not authenticate. They will allow you to store some data securely and release it if the face is recognized but if the problem you’re trying to solve is either substituting a username or password (or equivalent) with them you’ll be disappointed.

They are basically hardware unlocks allowing the secure element hardware on the device to decrypt stuff.

awesomeolion
Nov 5, 2007

"Hi, I'm awesomeolion."

Doctor w-rw-rw- posted:

FaceID & TouchID authorize, not authenticate. They will allow you to store some data securely and release it if the face is recognized but if the problem you’re trying to solve is either substituting a username or password (or equivalent) with them you’ll be disappointed.

They are basically hardware unlocks allowing the secure element hardware on the device to decrypt stuff.

Gotcha, in that case it sounds like more of an alternative or supplement to Keychain?

Doctor w-rw-rw-
Jun 24, 2008

awesomeolion posted:

Gotcha, in that case it sounds like more of an alternative or supplement to Keychain?

A backend for a subset of keychain item types.

Good Sphere
Jun 16, 2018

My iOS app has documents and data build up. I'm not sure what it my code is to blame at this point. I did find something inside a function for sharing video:

code:
let urlData = NSData(contentsOf: fileURL)
									
if urlData != nil {
 //share
}
Is it bad to use NSData in this way to check if the contents of the URL is valid? Is there a chance that calling NSData in this way is storing something permanently to documents and data?

brand engager
Mar 23, 2011

I think there is a method for checking if a path exists you can call from FileManager.default

Good Sphere
Jun 16, 2018

edit 2: I'll need to control the copy of the image somehow. From the Apple docs:

quote:

tmp/

Use this directory to write temporary files that do not need to persist between launches of your app. Your app should remove files from this directory when they are no longer needed; however, the system may purge this directory when your app is not running. The contents of this directory are not backed up by iTunes or iCloud.

https://developer.apple.com/library...0010672-CH2-SW4

edit:

I call this function:

code:
@objc func imagePickerController(_ picker: UIImagePickerController!, didFinishPickingImage image: UIImage!, editingInfo: NSDictionary!) {

}
I commented out everything inside. As soon as that function is called, the image is saved to the app's tmp directory. How do I stop this from happening?


---------------------------

I found out with certainty that my question wasn't the problem. I was happy to find I could save an exact copy of the app to my computer, with all the current documents and data, by going to Window >> Devices and Simulators >> Click phone on left pane >> Click installed app >> Click gear settings icon >> Download container.

There, (by exploring the package contents) I found all the photos inside the tmp folder were ones I imported from Photos, and not anything taken from the camera. I also just did a test to see that it happens immediately when I choose the image from imagePickerController. How does it save to the tmp folder at this point? I don't know yet. There's nothing there where I'm explicitly telling it to store the image to a URL.

Good Sphere fucked around with this message at 19:30 on Jan 31, 2020

Good Sphere
Jun 16, 2018

I figured it out. I'm using a different function, since I didn't know how to get access to the UIImagePickerController's url otherwise, but with a few extra steps, it was nothing hard and I'm able to delete the temporary file. Test a lot, and at zero documents and data gain. :mario:

code:
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
		
	// get url here
	if let imgURL = info[UIImagePickerController.InfoKey.imageURL] as? URL{

		// image is not passed explicitly. you need to get it from info
		let image = info[UIImagePickerController.InfoKey.originalImage] as! UIImage

		// do cool stuff


	}

	// delete. make sure the imported image is not saved to the app's tmp to avoid directory so documents and data filling up
	let fmTmp = FileManager.default
	try! fmTmp.removeItem(at: imgURL)

}

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.
It seems strange to me that you need to manage anything in the dictionary passed to that delegate method. I would expect the image picker to clean up after itself. Why do you need to delete the temp image file?

Good Sphere
Jun 16, 2018

pokeyman posted:

It seems strange to me that you need to manage anything in the dictionary passed to that delegate method. I would expect the image picker to clean up after itself. Why do you need to delete the temp image file?

Because they just pile up in the app's tmp directory; ever increasing the documents and data. Maybe iOS eventually decides to delete some or overwrite it, but it's annoying for users to see an app swallowing up all their available storage.

It's strange to me too, but it looks like Apple wants your app to be responsible for cleaning it up. Storing the image to tmp with UIImagePickerController is one of those things that doesn't make itself obvious, and you have to remember to deal with it.

Good Sphere fucked around with this message at 23:20 on Jan 31, 2020

Doc Block
Apr 15, 2003
Fun Shoe
Maybe give users a way to wipe out the whole tmp/ directory (or do it automatically if it’s above a certain size) than jump through a lot of hoops worrying about it.

Simulated
Sep 28, 2001
Lowtax giveth, and Lowtax taketh away.
College Slice

Good Sphere posted:

Because they just pile up in the app's tmp directory; ever increasing the documents and data. Maybe iOS eventually decides to delete some or overwrite it, but it's annoying for users to see an app swallowing up all their available storage.

It's strange to me too, but it looks like Apple wants your app to be responsible for cleaning it up. Storing the image to tmp with UIImagePickerController is one of those things that doesn't make itself obvious, and you have to remember to deal with it.

I'd need to check the source code but I suspect the image is not actually taking up space. It is likely an APFS clone. This may just be a bug in the storage view that is counting clones against the app.

Good Sphere
Jun 16, 2018

Doc Block posted:

Maybe give users a way to wipe out the whole tmp/ directory (or do it automatically if it’s above a certain size) than jump through a lot of hoops worrying about it.

I agree. Maybe they see it as an optimization to conserve battery power, but the fact that they would be doing it only with the case of importing images using UIImagePickerController makes me doubt that. The OS will make more free space eventually, though I can see users getting frustrated that their phone is running out of space without a good reason. I also noticed a lot of apps on my phone take up a huge amount of space in documents and data, when it makes no sense that they need to.


Simulated posted:

I'd need to check the source code but I suspect the image is not actually taking up space. It is likely an APFS clone. This may just be a bug in the storage view that is counting clones against the app.

After I saved a copy of the app from my phone to the computer, the images in the tmp directory came along with it. Any possibility those images are just pointing to my photo library on my phone, but when I make a copy of the app that's downloaded onto my computer, it also makes copies of those images? I thought it was making an exact copy of what was on the phone.

e: one weird thing I noticed is the app is storing ".closure" files in the tmp directory. I have no idea what these are for. Opening them as text is indecipherable.

Good Sphere fucked around with this message at 17:37 on Feb 3, 2020

Doc Block
Apr 15, 2003
Fun Shoe
An app’s tmp/ directory doesn’t really count as filling up the drive IMHO, since the operating system can just clear it out as needed. As you said, the problem is when they put stuff in Documents they should’ve put in tmp or cache.

TheReverend
Jun 21, 2005

Hey so I need to make a Swift Framework!

Looks like it's not the worst thing in the world, but I need some help with setup.

I see that the sim and device frameworks are separate and folks on SO are putting this post build scripts to merge the two frameworks into a single fat library.

Additionally, it looks like there needs to be ANOTHER script to shed the x86 stuff for when it's time to upload an app using the framework to the AppStore? Does that sound right?

The goal is to just make a cocoapod available to the public.

pokeyman
Nov 26, 2006

That elephant ate my entire platoon.
It sounds like you're looking to distribute the framework as a compiled binary? Because if you're ok shipping .swift files to users for them to compile then life is much easier.

The technically correct way to ship a binary framework is as an .xcframework. Unfortunately CocoaPods has not yet shipped a stable release that supports .xcframework. You can try the beta version (and your users will need to use beta CocoaPods too), and/or you can put together an .xcframework yourself and ship that bundle to users. It shouldn't be hard to "install" an .xcframework into an existing project (just drag it in) if you can get away without CocoaPods support for now. Also .xcframework requires Xcode 11 or higher, so if you need Xcode 10 support then welp.

The supposedly incorrect way is to build each architecture separately and then lipo the binaries together (which is what those scripts you see will do). Everyone does it, Apple folk say not to do it, and here we are with nothing supporting or using .xcframework months after its reveal.

Basically it's a mess with some promise on the horizon.

edit: Yes, if you lipo a bunch of binaries together you'll need to strip them back out of what you submit to the App Store, or your build will be rejected.

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?
It really isn’t valid though, and you really should not do it.

For example, what will you do when one of your customers says “Where’s the Mac Catalyst version?” What will you do when a different customer asks “Hey, can I get a version of your library for tvOS?”

Use the xcframework mechanism, support all of Apple’s platforms if possible (including both macOS and Mac Catalyst), and don’t worry about CocoaPods or support for older versions of Xcode.

Plorkyeran
Mar 22, 2007

To Escape The Shackles Of The Old Forums, We Must Reject The Tribal Negativity He Endorsed
Unless shipping your library in binary form is a hard requirement because your library is closed-source, just support one or more of cocoapods/carthage/swiftpm and you don't have to worry about any of the fat library nonsense because the package manager deals with all of that for you.

If you do need to ship in binary form then you really don't want to do so via cocoapods. xcframeworks are sort of a half-baked mess, but assuming that building in swift library evolution mode doesn't cause any problems for you they aren't actively worse than the old workarounds so there's no reason not to use them for a new library.

Adbot
ADBOT LOVES YOU

brap
Aug 23, 2004

Grimey Drawer
Does swiftpm work in Xcode yet

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