← Back to blog

Swift for React Native Developers: What I Learned

I spent years building mobile apps in React Native. Then I started writing native iOS code. The transition wasn’t what I expected.

Why Make the Switch?

React Native is great for shipping fast. You write once, deploy twice, and the JavaScript ecosystem gives you a package for almost anything. But there are tradeoffs.

Some things are harder than they should be. Deep OS integrations feel like fighting the framework. Performance-critical features need native modules anyway. And debugging issues that span the JS-native bridge can be brutal.

At Zopa, we hit a point where certain features needed native implementation. Someone had to write Swift. I volunteered, built a proof of concept, and ended up owning the first fully native product journey in our hybrid app. That proof of concept turned into a career shift.

What Transfers

More than you’d think.

Component thinking translates directly. SwiftUI is basically React with different syntax. You build small, reusable views. You pass data down. State changes trigger re-renders. If you understand React’s mental model, SwiftUI clicks fast.

State management patterns carry over too. The problems are the same: where does state live, how does it flow, how do you avoid prop drilling. SwiftUI has @State, @Binding, @ObservedObject, and @EnvironmentObject. Different names, same concepts.

Networking and async code feels familiar. URLSession is like fetch. Swift’s async/await works almost identically to JavaScript’s. Combine is basically RxJS.

The build/test/ship cycle is similar. You still write unit tests, UI tests, work with CI/CD. The tools change but the process doesn’t.

UI testing actually works. In React Native, UI testing means Detox or Appium, which rely on adapters and bridges to communicate with the native layer. These adapters are usually where things break. Tests flake out, timeouts creep in, and you spend more time debugging the test framework than the actual app. With native iOS, you use XCUITest directly. No adapters, no bridges, just Apple’s framework talking to Apple’s OS. Tests are faster, more reliable, and when something fails it’s usually your code, not the tooling.

What Doesn’t Transfer

The type system is different. TypeScript types disappear at runtime. Swift types are real. Optionals are everywhere and the compiler won’t let you ignore them. This is annoying for the first week and then you realise how many null pointer bugs you’ve been shipping in JavaScript.

Memory management matters. React Native handles garbage collection. Swift uses ARC (Automatic Reference Counting). You need to understand strong vs weak references or you’ll create retain cycles that leak memory. This was completely new to me.

The good news: Apple recommends using structs by default, and structs sidestep most of these issues. Structs are value types, meaning they get copied when assigned or passed around. No shared references, no retain cycles, no ARC headaches. They’re also faster and thread-safe by default. Classes are reference types and only needed when you genuinely need shared mutable state or inheritance. Coming from JavaScript where everything is effectively a reference, this takes some adjustment. But once you embrace “struct first”, memory management becomes much simpler.

Architecture is less prescribed. React pushes you toward Flux patterns. Redux, Zustand, MobX, whatever flavour you pick, the mental model is similar: unidirectional data flow, actions, reducers, a single source of truth. The ecosystem has opinions.

Swift doesn’t. You’ll find MVC (Apple’s original recommendation, now showing its age), MVVM (popular with SwiftUI), VIPER (overly complex for most apps), and The Composable Architecture (TCA, which actually feels like Redux). There’s no default answer. Teams argue about this endlessly. Coming from React where the patterns are more settled, this freedom can feel paralysing at first. My advice: start with simple MVVM for SwiftUI, learn the tradeoffs, then decide if you need something heavier.

UIKit is nothing like the web. If you need to drop below SwiftUI into UIKit, the paradigm is totally different. It’s imperative, not declarative. You’re mutating objects, managing view lifecycles, dealing with delegates. It feels ancient after React.

Xcode takes getting used to. The debugger is powerful but different. The build system is opaque. Provisioning profiles and code signing will make you question your career choices. Give it time.

What I Had to Unlearn

Stop thinking in CSS. SwiftUI layout isn’t flexbox. It’s not CSS Grid. Stacks, frames, and alignment guides work differently. Fighting it with web mental models just slows you down. Learn the SwiftUI way.

Stop reaching for packages. In JavaScript, you npm install everything. In iOS, you think twice before adding dependencies. The ecosystem is smaller and more conservative. You’ll write more code yourself, and that’s often fine.

Stop fearing the platform. React Native abstracts the platform away. Native development means embracing it. Read Apple’s Human Interface Guidelines. Learn the system patterns. Use standard components. Your app will feel better for it.

The Surprising Parts

Swift is a really nice language. After years of JavaScript’s quirks, Swift feels designed. Enums with associated values, pattern matching, extensions, protocols. The language helps you write correct code.

The simulator is fast. React Native hot reload is great, but native SwiftUI previews and the iOS simulator are surprisingly quick. The feedback loop isn’t as different as I expected.

Apple’s frameworks are good. Once you get past the learning curve, frameworks like Combine, SwiftData, and CryptoKit are well designed. The documentation is thorough. The APIs feel cohesive.

The community is smaller but helpful. Stack Overflow has fewer answers, but the iOS community on Twitter, blogs, and Discord is welcoming. People share knowledge generously.

Should You Make the Switch?

It depends what you want.

If you love shipping products fast and working across platforms, React Native is still great. The ecosystem keeps improving. Most apps don’t need native performance.

If you’re drawn to deeper OS integration, performance-sensitive features, or just want to understand the full stack, learning native is worth it. You become a better React Native developer too, because you understand what’s happening under the bridge.

I didn’t plan to become an iOS developer. I just kept saying yes to problems that needed native solutions. The transition happened gradually, then all at once.

If you’re curious, start small. Write a native module for your React Native app. Build a side project in SwiftUI. See if it clicks. It might surprise you.