Skip to content

Instantly share code, notes, and snippets.

View tigi44's full-sized avatar

tigi44 tigi44

View GitHub Profile
@tigi44
tigi44 / EncodingURL.swift
Last active March 4, 2024 01:08
iOS16이하 버전에서 한글이 포함된 URL을 사용할 때 Decodable URL 이슈 발생 (iOS17 부터는 한글 이슈 없음), iOS16이하에서는 URL 대신 EncodingURL로 사용
public struct EncodingURL: Codable {
private let value: String
public var url: URL? {
guard let url = URL(string: value) else {
guard let encodedValue = value.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed),
let url = URL(string: encodedValue) else {
return nil
}
@tigi44
tigi44 / combineTestCase.swift
Created April 29, 2022 08:29
Unit testing Combine/Result Swift code
import XCTest
import Combine
public extension XCTestCase {
func awaitPublisher<T: Publisher>(
_ publisher: T,
timeout: TimeInterval = 10,
file: StaticString = #file,
line: UInt = #line
@tigi44
tigi44 / build-xcframework.sh
Created February 28, 2022 06:52 — forked from quangDecember/build-xcframework.sh
Build XCFramework (universal) framework, create new Aggregate target, add to New Run Script Phase
env > env.txt
instruments -s devices > devices.txt
#! /bin/sh -e
# This script demonstrates archive and create action on frameworks and libraries
# Based on script by @author Boris Bielik
# Release dir path
OUTPUT_DIR_PATH="${PROJECT_DIR}/XCFramework"
function archivePathSimulator {
@tigi44
tigi44 / NotificationSwiftUIApp.swift
Last active January 25, 2022 06:49
Local Notification on SwiftUI
import SwiftUI
@main
struct NotificationSwiftUIApp: App {
var body: some Scene {
WindowGroup {
ContentView()
.task {
await NotificationHelper.shared.requestAuth()
@tigi44
tigi44 / KeyChainHelper.swift
Created January 5, 2022 06:27
use a propertyWrapper for keychain in SwiftUI
import Foundation
class KeyChainHelper {
static let shared = KeyChainHelper()
func save(data: Data, key: String, account: String) {
let query = [
kSecValueData: data,
@tigi44
tigi44 / AsyncAwaitWithCombineView.swift
Last active July 11, 2023 07:15
Async / Await with Combine in Swift, SwiftUI (MVVM pattern)
import SwiftUI
struct AsyncAwaitWithCombineView: View {
@StateObject var viewModel: AsyncAwaitWithCombineViewModel = AsyncAwaitWithCombineViewModel()
var body: some View {
NavigationView {
@tigi44
tigi44 / SheetPresentation.swift
Last active February 20, 2024 14:40
Using a UISheetPresentationController on SwiftUI
import SwiftUI
// MARK: - SheetPresentation
public extension View {
func sheetPresentation<SheetView: View>(isPresented: Binding<Bool>, @ViewBuilder sheetView: @escaping () -> SheetView, onDismiss: SheetPresentationController<SheetView>.DefaultClosureType? = nil) -> some View {
self.background(
@tigi44
tigi44 / FitButton.m
Created December 7, 2021 02:11
Adjust UIButton Size depend on title label
#import "FitButton.h"
@implementation FitButton
-(CGSize)intrinsicContentSize {
return [self.titleLabel sizeThatFits:CGSizeMake(self.titleLabel.preferredMaxLayoutWidth, CGFLOAT_MAX)];;
}
-(void)layoutSubviews {
self.titleLabel.preferredMaxLayoutWidth = self.frame.size.width;
[super layoutSubviews];
@tigi44
tigi44 / XCFramework.sh
Created August 19, 2021 01:49
Create a XCFrameWork
$ xcodebuild archive -scheme [Scheme 명] -archivePath [Archive 출력 경로] -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# ex) iOS, iOS Simulator, macOS
$ xcodebuild archive -scheme FlightKit -archivePath "./build/ios.xcarchive" -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES
$ xcodebuild archive -scheme FlightKit -archivePath "./build/ios_sim.xcarchive" -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES
$ xcodebuild archive -scheme FlightKit -archivePath "./build/mac.xcarchive" SKIP_INSTALL=NO BUILD_LIBRARY_FOR_DISTRIBUTION=YES
# create xcframework
xcodebuild -create-xcframework \
@tigi44
tigi44 / Observable.swift
Last active January 26, 2022 02:17
Observable.swift
class Observable<T> {
var value: T? {
didSet {
listener?(value)
}
}
private var listener: ((T?) -> Void)?