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 ViewBuilder in SwiftUI

Issue #877

Over the course of making several SwiftUI apps, I’ve discovered quite a few hidden magic of SwiftUI that are quite fun.

Here are 6 interesting SwiftUI features in View Builder many don’t know are even possible 🤯

View protocol …

How to debounce TextField search in SwiftUI

Issue #876

Make a dedicate DebounceObject to debounce (or throttle). Then we can even observe with onChange on the debouncedText or just use it directly to sort

import Combine

public final class DebounceObject: ObservableObject {
    @Published var …

How to create document based macOS app

Issue #875

Read newDocument

This method calls openUntitledDocumentAndDisplay(_:).

Read openUntitledDocumentAndDisplay

The default implementation of this method calls defaultType to determine the type of new document to create, calls …

How to add dot indicator to tab bar item in iOS

Issue #874

From iOS 13, use UITabBarAppearance and UITabBarItemAppearance

let appearance = UITabBarAppearance()

let itemAppearance = UITabBarItemAppearance(style: .stacked)
itemAppearance.normal.badgeBackgroundColor = .clear
itemAppearance.normal. …

How to use Multipeer Connectivity

Issue #873

Use assistant

let assistant = MCAdvertiserAssistant(serviceType: "my-service, discoveryInfo: nil, session: mcSession)
assistant.start()

let browser = MCBrowserViewController(serviceType: "my-service", session: mcSession) …

How to generate Polygon wallet account in Swift

Issue #871

Use libraries

import web3
import web3keystore
import KeychainAccess

private final class KeyStorage: EthereumKeyStorageProtocol {
    enum Key: String { …

How to learn Polygon programming

Issue #870

Building

Sidechain

How to make simple Plist builder with resultBuilder in Swift

Issue #869

We can use PropertyListEncoder from Swift 4

let encoder = PropertyListEncoder()
encoder.outputFormat = .xml
let data = try encoder.encode(model)

Or we can manually do with resultBuilder style

Declare @resultBuilder for PlistBuilder that …

How to generate JWT token for App Store Connect API in Swift

Issue #868

Use JWTKit and code from AppStoreConnect library

import JWTKit

public struct Credential {
    let issuerId: String
    let privateKeyId: String
    let privateKey: String

    public init(
        issuerId: String,
        privateKeyId: …

How to send SPL token in Swift

Issue #867

Using https://github.com/ajamaica/Solana.Swift and the sendSPLToken method. Note that the from is the token account address and amount can have decimals

solana.action.sendSPLTokens(
    mintAddress: MINT_ADDRESS,
    from: …

How to calculate Solana transaction fee

Issue #866

A simple way is to use a fixed fee of 0.000005

For example from https://solscan.io/tx/5DkApvwTYuMqCiA94MhUVKJoLn8MGma9gAWXhreRJKqAs395P5CqEK3R84m3MWjcTKMem53XcLwYErGkaJAbQC2h?cluster=testnet

And call some exchange API, like Coingecko …

How to parse large JSON Dictionary in Swift

Issue #865

We can define some typealias and build extensions on JSONDictionary to easily extract values

typealias JSONDictionary = [String: Any]
typealias JSONArray = [JSONDictionary]

extension JSONDictionary {
    func dict(_ key: String) -> …

How to make simple async URLSession in Swift

Issue #864

Since async URLSession.shared.data is available in iOS 15+, we can build a custom one with withCheckedThrowingContinuation

import UIKit

enum HTTPMethod: String {
    case get = "GET"
    case post = "POST"
}

extension …

How to check SPL token balance on Solana

Issue #863

We will check USDC token balance on Solana testnet.

Firstly, we will use https://usdcfaucet.com/ to airdrop some USDC tokens into our wallet. Secondly, we check USDC token mint address on testnet cluster using Solana Explorer …

How to learn Solana programming

Issue #862

General

How to use subscript in Swift

Issue #861

Make it easy to access common cases, for example UserDefaults

extension UserDefaults {
    enum Key: String {
        case hasBackup
    }

    subscript(key: Key) -> Bool {
        get {
            bool(forKey: key.rawValue)
        } …

How to encode JSON dictionary into JSONEncoder

Issue #860

JSONEncoder deals with type-safe, so we need to declare an enum JSONValue for all possible types. We also need a custom initializer to init JSONValue from a JSON Dictionary

import Foundation

enum JSONValue {
    case string(String) …

How to parse Apple Pay PKPayment in Swift

Issue #859

To parse PKPayment and used with Wyre CreateAppleOrder API, we can declare some Encodable structs

import PassKit
import Foundation

struct PaymentObject: Encodable {
    var billingContact: Contact?
    var shippingContact: Contact? …

How to pop multiple level with NavigationView and NavigationLink in SwiftUI

Issue #858

Use isActive and isDetailLink(false)

Use Introspect

.introspectNavigationController { nav in
    self.nav = nav
}

Read more

How to generate Solana wallet acount in Swift

Issue #857

Use Solana.swift and Mnemonic seed phrase. For production, change endpoint to mainnet

import UIKit
import Solana
import KeychainAccess

enum SolanaError: Swift.Error {
    case accountFailed
    case unauthorized
}

final class …

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