Khoa Pham
Khoa Pham

Ohayo

Swift Discovery

Discover all the tech

Featured

My year in review 2020

Issue #715

I remember this time last year in December 2019, I spent almost every single bit of my free time on Puma because I want a Swift friendly version of fastlane that suits my need and leverages Swift 5 features.

Here’s my review of my …

How to use Apple Pay in iOS

Issue #856

Use PKPaymentRequest and PKPaymentAuthorizationViewController

@MainActor
final class WalletViewModel: NSObject, ObservableObject {
    var canMakePayments: Bool {
        PKPaymentAuthorizationViewController.canMakePayments()
    } …

How to show QR code in SwiftUI

Issue #855

Use CoreImage to generate QR image

import SwiftUI
import CoreImage.CIFilterBuiltins

struct QRView: View {
    let qrCode: String
    @State private var image: UIImage?

    var body: some View {
        ZStack {
            if let image = …

How to not encode with Enum key in Swift

Issue #854

If you use enum case as key in Dictionary, JSONEncoder will encode it as Array. For example

enum Vehicle: String, Codable {
    case car
    case truck
}
struct Container: Codable {
    var map: [Vehicle: String]
}
struct Container2: …

How to disable with ButtonStyle in SwiftUI

Issue #853

With ButtonStyle, the disabled modifier does not seem to work, we need to use allowsHitTesting.

import SwiftUI

struct ActionButtonStyle: ButtonStyle {
    func makeBody(configuration: Configuration) -> some View {
        HStack { …

How to query document id in array in Firestore

Issue #852

Supposed we have Book object

struct Book: Identifiable, Codable, Hashable {
    @DocumentID var id: String?
}

We should use FieldPath instead of id for query

let booksRef: CollectionReference = ...
let ids: [String] = ...

booksRef
    . …

How to provide default Codable in Swift

Issue #851

Use DefaultValue to provide defaultValue in our property wrapper DefaultCodable

public protocol DefaultValue {
    associatedtype Value: Codable
    static var defaultValue: Value { get }
}

public enum DefaultBy {
    public enum True: …

How to use dynamic shape in SwiftUI

Issue #850

Erase with AnyShape

struct AnyShape: Shape {
    init<S: Shape>(_ wrapped: S) {
        innerPath = { rect in
            let path = wrapped.path(in: rect)
            return path
        }
    }

    func path(in rect: CGRect) -> …

How to use Picker with optional selection in SwiftUI

Issue #849

We need to explicitly specify optional in tag

extension AVCaptureDevice: Identifiable {
    public var id: String { uniqueID }
}

@State var device: AVCaptureDevice?

Picker("Camera", selection: $device) {
    ForEach(manager. …

How to deinit NSWindow

Issue #848

Hold a weak reference to NSWindow, and let system window server manages its lifetime

weak var window = NSWindow()
window.isReleasedWhenClosed = true

How to scale system font size to support Dynamic Type

Issue #847

We should use Dynamic Font Type as much as possible, as per Typography guide and https://www.iosfontsizes.com/

But in case we have to use a specific font, we can scale it with UIFontMetrics

import SwiftUI
import UIKit

extension Font { …

How to round specific corner in SwiftUI

Issue #846

We use UIBezierPath with addArc to draw specific corner with different rounding values.

import SwiftUI

extension View {
    func clipCorners(
        topLeft: CGFloat = 0,
        bottomLeft: CGFloat = 0,
        topRight: CGFloat = 0, …

How to show suffix text in TextField in SwiftUI

Issue #845

Suppose we have struct Payment as the state, we declare custom Binding<String> that derives from our state.

struct Payment {
    var amount: Int = 0
}

To show our suffix view, we use .fixedSize(horizontal: true, vertical: false) to …

How to show currency symbol in TextField in SwiftUI

Issue #844

Use custom Binding and validate the text. In case of zero, return empty string to let TextField display placeholder

var textField: some View {
    let text = Binding<String>(
        get: {
            state.amount > 0 ? "$\( …

How to make multiline message text view in SwiftUI

Issue #843

This can be used in message bar input or some popover form. We use sizeThatFits to calculate the height so that it grow under certain height limit

import SwiftUI
import UIKit

struct MessageTextField: View {
    let placeholder: String …

How to read safe area insets in SwiftUI

Issue #842

Declare EnvironmentKey and read safeAreaInsets from key window in connectedScenes

struct SafeAreaInsetsKey: EnvironmentKey {
    static var defaultValue: EdgeInsets {
        UIApplication.shared.keyWindow?.safeAreaInsets.swiftUIInsets ?? …

How to make tab strip with enum cases in SwiftUI

Issue #841

Declare generic on RawRepresentable

import SwiftUI

struct TabStrip<T: RawRepresentable & Hashable>: View where T.RawValue == String {
    let values: [T]
    @Binding var selected: T

    var body: some View {
        ScrollView …

How to replace multiple regex matches in Swift

Issue #840

Used to replace credit card regex 30[0-5]#-######-###L in EasyFake

We can use ? to have non-greedy behavior, or I here use square bracket to fine-tune the expression \{[\d*,]*\d*\} Also, I need to reversed the matches because each …

How to move files with Swift script

Issue #839

Use locales data from faker.js to https://github.com/onmyway133/EasyFake, renaming files since files, regardless of sub directories in Xcode, must have different name.

We use enumerator API on FileManager to traverse all files in all …

How to map Binding with optional value in SwiftUI

Issue #838

We can write our custom Binding

import SwiftUI

extension Binding where Value == Date? {
    func flatten(defaultValue: Date) -> Binding<Date> {
        Binding<Date>(
            get: { wrappedValue ?? defaultValue }, …

How to get view height in SwiftUI

Issue #837

I usually use GeometryReader in background to get size of view, and encapsulate it inside a ViewModifier

struct GetHeightModifier: ViewModifier {
    @Binding var height: CGFloat

    func body(content: Content) -> some View { …

Khoa Pham

Hello, I’m Khoa

I’m a thinker and storyteller with a passion for exploring the intersection of creativity and technology

🧑‍💻 I love crafting high quality and useful apps
🔥 I love open source. My GitHub open source has 2.3k followers with packages that are integrated by 45k+ apps and over 3.4m+ downloads on CocoaPods.
✍️ I write here on my blog and on Medium, which has over 2.7k+ followers with tons of articles and 90k+ monthly views.
🖥 Follow me for sharings about Swift, SwiftUI, iOS and macOS development.
Hei