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 …

WWDC21 SwiftUI Q&A

Issue #917

Interesting SwiftUI Q&A during WWDC21

@StateObject or ObservedObject?

Q: Let’s say I have a purely SwiftUI flow. I have a ListView with a @StateObject var listFetcher, that makes requests for a list of items. Tapping on an item in the …

What's new in SwiftUI iOS 17 at WWDC23

Issue #916

WWDC23 brings new additions to SwiftUI

Screenshot 2023-06-07 at 22 02 36

Scrolling

The scroll transition modifier is very similar to the visual effect modifier Curt used earlier for the welcome screen. It lets you apply effects to items in your scroll view.

I’m …

Recommended iOS articles to read

Issue #915

Here are my favorite iOS articles

How to render markdown view with React

Issue #914

Use react-markdown to parse markdown content, react-syntax-highlighter to highlight code, and rehype-raw to parse raw html

import ReactMarkdown from "react-markdown"
import { Prism as SyntaxHighlighter } from …

How to create Quick look thumbnail for files

Issue #913

Use QuickLookThumbnailing framework

import AppKit
import QuickLookThumbnailing

actor QuicklookService {
    static let shared = QuicklookService()
    
    private let generator = QLThumbnailGenerator.shared
    
    func image( …

How to deal with actor reentrancy in Swift

Issue #912

Perform check before and after suspension point

actor Worker {
    var isDoing = false
    var toBeDone = Set<String>()
    
    func work(string: String) async {
        if isDoing {
            toBeDone.insert(string) …

How to run parallel Task with Swift concurrency

Issue #911

Make an parallelTask function that wraps TaskGroup

public func parallelTask(@ParallelTaskBuilder builder: () -> [ParallelTaskBuilder.Work]) async {
    await withTaskGroup(of: Void.self) { group in
        for work in builder() { …

How to use Range and NSRange in Swift

Issue #910

Use one-sided range operator

let string = "Hello world"
string[string.startIndex...] // Hello world
string[..<string.endIndex] // Hello world

Substring

let string = "Hello world"
let range = string.startIndex ..< …

How to use Tailwind

Issue #909

Resources

Paid

How to handle status bar with custom overlay UIWindow

Issue #908

When we add another UIWindow, then its rootViewController will decide the style of the status bar, not the rootViewController of the keyWindow anymore

childForStatusBarStyle

The usual way to fix this is to defer the decision to the correct …

How to use SwiftUI Charts

Issue #907

Read more

How to make SwiftUI widget in iOS

Issue #906

Read more

How to use actor in Swift concurrency

Issue #905

Protect mutable state with Swift actors

Actor reentrancy

abc

Imagine we have two different concurrent tasks trying to fetch the same image at the same time. The first sees that there is no cache entry, proceeds to start downloading the …

How Task use thread in Swift concurrency

Issue #904

Consider this code where we have an ObservableObject with fetch1 and async fetch2, and a fetch inside ContentView

Here the observation in Xcode 14

  • ViewModel.fetch1: run on main thread
  • ViewModel.fetch2: run on cooperative thread pool …

How to show animated gif NSImage on Mac

Issue #903

let image = NSImage(contentsOf: url)
let imageView = NSImageView(image: image)
image.animates = true

How to handle shortcut intents in iOS

Issue #902

iOS 13 Intents Extension & Intents UI Extension

Siri can predict shortcuts to actions that a user may want to perform using your app, and suggest those shortcuts to the user in places such as …

How to use Universal Links in iOS

Issue #901

Apple app site association

https://com.example/.well-known/apple-app-site-association

Supporting Associated Domains New format from iOS 13 Can also remove components section if we match all URLs

{
  "applinks": { …

How to find previous frontmost application in macOS

Issue #900

Listen to didActivateApplicationNotification and check that it is not our app

NSWorkspace.shared.notificationCenter
    .publisher(for: NSWorkspace.didActivateApplicationNotification)
    .sink(receiveValue: { [weak self] note in …

How to show view below title bar for macOS in SwiftUi

Issue #899

Use NSTitlebarAccessoryViewController

var titleBarAccessoryVC: NSTitlebarAccessoryViewController {
    let vc = NSTitlebarAccessoryViewController()
    let view = HStack {
        Spacer()
        Button {
            
        } label: { …

How to drag using DragGesture in SwiftUI

Issue #898

Change element position using either offset or position, and use DragGesture

Use GestureState to store the updating startDragLocation to keep the start location when drag begins, so we can add translation

struct MoveModifier: ViewModifier …

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