Skip to content

Instantly share code, notes, and snippets.

@VAnsimov
VAnsimov / UserDefaultsWrapper.swift
Last active November 3, 2020 14:28
UserDefaultsWrapper
import Foundation
private protocol AnyOptional {
var isNil: Bool { get }
}
extension Optional: AnyOptional {
var isNil: Bool { self == nil }
}
@VAnsimov
VAnsimov / LifeCycleApp-Example1.swift
Last active November 6, 2020 11:29
Application life cycle
@main
struct YourApp: App {
var body: some Scene {
let publisherBackground = NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification)
let publisherForeground = NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification)
return WindowGroup {
RootView()
.onReceive(publisherBackground) { _ in
import Foundation
import ARKit
extension ARPlaneAnchor {
@discardableResult
func addPlaneNode(on node: SCNNode, geometry: SCNGeometry, contents: Any) -> SCNNode {
guard let material = geometry.materials.first else { fatalError() }
if let program = contents as? SCNProgram {
@VAnsimov
VAnsimov / HostingView Example.swift
Last active June 28, 2024 15:17
SwiftUI View to UIView
import UIKit
import SwiftUI
// SwiftUI
struct SomeView: View {
var body: some View {
Text("Hello World!")
}
}
// 1
final class MVIContainer<Intent, Model>: ObservableObject {
// 2
let intent: Intent
let model: Model
private var cancellable: Set<AnyCancellable> = []
init(intent: Intent, model: Model, modelChangePublisher: ObjectWillChangePublisher) {
extension ListView {
static func build() -> some View {
let model = ListModel()
let intent = ListIntent(model: model)
let container = MVIContainer(
intent: intent,
model: model as ListModelStatePotocol,
modelChangePublisher: model.objectWillChange)
struct ListView: View {
// 1
@StateObject private var container: MVIContainer<ListIntent, ListModelStatePotocol>
var body: some View {
// 2
Text(container.model.text)
.padding()
.onAppear(perform: {
final class ListIntent {
// 1
private weak var model: ListModelActionsProtocol?
init(model: ListModelActionsProtocol) {
self.model = model
}
func viewOnAppear() {
// 1
protocol ListModelStatePotocol {
var text: String { get }
}
// 2
protocol ListModelActionsProtocol: AnyObject {
func parse(number: Int)
}
// 1
final class ListModel: ObservableObject, ListModelStatePotocol {
@Published var text: String = ""
}
// 2
extension ListModel: ListModelActionsProtocol {
func parse(number: Int) {
text = "Random number: " + String(number)