MVVMÇ (MVVM Calçot) is an implementation of MVVM influenced by VIPER. Basically VIPER with MVVM names.
The most important concept of MVVMÇ is that implements MVVM with immutable ViewModels, this helps to write correct and testable code with minor complexity.
Other than this it introduces Interactor
and Coordinator
to MVVM.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import UIKit | |
protocol Interactor: class { | |
associatedtype ModelType | |
var model: ModelType { get } | |
var modelDidUpdate: (() -> Void)? { get set } | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
private extension MKMapRect { | |
func with(offset: UIOffset, size: CGSize) -> MKCoordinateRegion { | |
let horizontalRatio = self.size.width / Double(size.width) | |
let verticalRatio = self.size.height / Double(size.height) | |
let mapRect = MKMapRectInset(self, horizontalRatio * Double(offset.horizontal), verticalRatio * Double(offset.vertical)) | |
var region = MKCoordinateRegionForMapRect(mapRect) | |
let minSpan = 0.001 | |
region.span = MKCoordinateSpanMake(max(region.span.latitudeDelta, minSpan), max(region.span.longitudeDelta, minSpan)) | |
return region |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//: Playground - noun: a place where people can play | |
import Foundation | |
public struct ConstraintPriority : ExpressibleByFloatLiteral, Equatable, Strideable { | |
public typealias FloatLiteralType = Float | |
public typealias Stride = Float | |
public let value: Float |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// CallRecordMatcher.swift | |
// Verse | |
// | |
// Created by Alex Manzella on 13/01/17. | |
// Copyright © 2017 Verse Technologies, Inc. All rights reserved. | |
// | |
import Foundation | |
import Nimble |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
/// Creates a Test dummy of the needed type! | |
/// Works with any value type or class (?) | |
func dummy<T>() -> T { | |
let size = MemoryLayout<T>.size | |
let alignment = MemoryLayout<T>.alignment | |
let p = UnsafeMutableRawPointer.allocate(bytes: size, alignedTo: alignment) | |
return p.bindMemory(to: T.self, capacity: 1).pointee |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import UIKit | |
/// A `UIScrollView` subclass that adapts its `intrinsicContentSize` to its `contentSize` | |
final class IntrinsicSizeAwareScrollView: UIScrollView { | |
private let keyPath = NSStringFromSelector(#selector(getter: contentSize)) | |
override init(frame: CGRect) { | |
super.init(frame: frame) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import Foundation | |
import UIKit | |
import Nimble | |
func scroll(_ axis: UILayoutConstraintAxis) -> ScrollMatcher { | |
return ScrollMatcher(axis: axis) | |
} | |
struct ScrollMatcher: Matcher { |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-Xfrontend -debug-time-function-bodies | |
Found somewhere: | |
pbpaste | egrep '\.[0-9]ms' | sort -t "." -k 1 -n | tail -20 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class CustomLayerView<T: CALayer>: UIView { | |
var customLayer: T { | |
get { | |
return self.layer as! T | |
} | |
} | |
override class func layerClass() -> AnyClass { | |
return T.self |
NewerOlder