Skip to content

Instantly share code, notes, and snippets.

@pofat
pofat / Kind.swift
Created Mar 12, 2021
Swift Struct Metadata
View Kind.swift
// Kind of type
public enum Kind {
case `struct`
case `enum`
case optional
case opaque
case tuple
case function
case existential
case metatype
View get_pre_main_time.swift
/// Call this at main()
/// return: time in milliseconds
func getPreMainTime() -> Double {
let currentTimeIntervalInMilliSecond = Date().timeIntervalSince1970 * 1000.0
var procInfo = kinfo_proc()
let pid = ProcessInfo.processInfo.processIdentifier
var cmd: [Int32] = [CTL_KERN, KERN_PROC, KERN_PROC_PID, pid]
var size = MemoryLayout.stride(ofValue: procInfo)
// Retrieve information of current process
if sysctl(&cmd, UInt32(cmd.count), &procInfo, &size, nil, 0) == 0 {
@pofat
pofat / Podfile
Created Feb 16, 2020
Turn your pods into statically linked
View Podfile
# Add these in your Podfile (available for CocoaPods v1.7.x+)
# Replace with any Pods that you want to keep dynamically linked
keep_dynamically_linked = ['RxCocoa', 'RxSwift']
target 'YourApp' do
# all you pods here...
end
@pofat
pofat / scan_unused_selectors.swift
Created Feb 16, 2020
Scan unused ObjC selectors
View scan_unused_selectors.swift
/*
* Note: You need to build this script before use
* Usage:
* 1. Build by `swfitc scan_unused_selectors.swift`
* 2. Run by `./scan_unused_selectors /path/to/yourMachO`
*
* How to locate MachO of your APP (`/path/to/yourMachO` in above example)? In your Xcod project navigator, you can find a folder `Products`
* In that folder you can see your app (after any build) and right click on it -> "Show In Finder"
* You can get your APP's location by drag it into your terminal. Say it's "/path/to/MyApp.app", your MachO path would be "/path/to/MyApp.app/MyApp"
*/
@pofat
pofat / main.swift
Last active Oct 17, 2020
How to write main function in a Swift iOS project
View main.swift
import Foundation
import UIKit
UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, NSStringFromClass(UIApplication.self), NSStringFromClass(AppDelegate.self))
// Remeber to comment or remove `@UIApplicationMain` in your AppDelegate.swift
@pofat
pofat / Dictionary+Extension.swift
Last active Dec 28, 2019
String KeyPath accessor of Dictionary
View Dictionary+Extension.swift
import Foundation
// Time Complexity: O(N), N stands for the level of key path
extension Dictionary where Key == String {
subscript(keyPath keyPath: String) -> Any? {
get {
guard !keyPath.isEmpty else { return nil }
var value: Any? = self
for key in keyPath.components(separatedBy: ".") {
if let node = (result as? [Key: Any])?[key] {
@pofat
pofat / Either.swift
Created Nov 14, 2019
Codable Either
View Either.swift
enum Either<A, B> {
case left(A)
case right(B)
}
extension Either: Decodable where A: Decodable, B: Decodable {
init(from decoder: Decoder) throws {
let container = try decoder.singleValueContainer()
if let a = try? container.decode(A.self) {
self = .left(a)
View Keybase.md

Keybase proof

I hereby claim:

  • I am pofat on github.
  • I am pofat (https://keybase.io/pofat) on keybase.
  • I have a public key ASDG9WSBfhua2AKTJqJhSDqdAuCPFwSEfVnVlhryt9fTVQo

To claim this, I am signing this object:

@pofat
pofat / ORT.swift
Created Oct 19, 2019
Use `Opaque Return Type` to erase type.
View ORT.swift
// 想像以下 function 定義在某一個 module 裡,外部無法決定也不依賴具體的型別 (此 func 你可以呼叫但裡面實作看不到)
func getIterator() -> some IteratorProtocol {
var state = (0, 1)
return MyAnyIterator { () -> Int in
let upcomingNumber = state.0
state = (state.1, state.0 + state.1)
return upcomingNumber
}
}
@pofat
pofat / type_erasure.swift
Last active Feb 17, 2020
如何用 generic struct 消除 PAT 的問題
View type_erasure.swift
// 利用 init with closure 來自動代入 `Element` 真實的型別,而不是直接用 <某型別> 的方式來指定
// 先宣告一個 generic struct
struct MyAnyIterator<Element> {
// 內部使用的 Box ,裡面就是把 closure 存起來,本身也滿足 IteratorProtocol
private class AnyIteratorBox<Element>: IteratorProtocol {
typealias Base = () -> Element?
private var _base: Base
init(_ base: @escaping Base) {
self._base = base