Skip to content

Instantly share code, notes, and snippets.

View leodabus's full-sized avatar

Leonardo Savio Dabus leodabus

  • Invillia
View GitHub Profile
extension Date {
var year: Int { return Calendar.autoupdatingCurrent.component(.year, from: self) }
var month: Int { return Calendar.autoupdatingCurrent.component(.month, from: self) }
var day: Int { return Calendar.autoupdatingCurrent.component(.day, from: self) }
var firstDayOfMonth: Date {
return Calendar.autoupdatingCurrent.date(from: DateComponents(year: year, month: month, day: 1))!
}
var lastDayOfMonth: Date {
return Calendar.autoupdatingCurrent.date(from: DateComponents(year: year, month: month+1, day: 0))!
}
extension BidirectionalCollection where Iterator.Element == String, SubSequence.Iterator.Element == String {
var sentence: String {
guard let last = last else { return "" }
return count <= 2 ? joined(separator: " and ") :
dropLast().joined(separator: ", ") + " and " + last
}
}
let myArray = [CGPoint(x: 0.1 + 0.2, y: 0), CGPoint(x: 0.3, y: 0), CGPoint(x: 2, y: 2), CGPoint(x: 2, y: 2)]
var counts = [String: Int]()
myArray.forEach { counts[$0.debugDescription] = (counts[$0.debugDescription] ?? 0) + 1 }
if let (value, count) = counts.max(by: {$0.value < $1.value}) {
print("\(value) occurs \(count) times") // "(0.3, 0.0) occurs 2 times\n"
}
extension CGPoint: Hashable {
public var hashValue: Int {
return (self as NSValue).hashValue
}
}
struct Point: Hashable {
let cgPoint: CGPoint
var nsValue: NSValue { return cgPoint as NSValue }
var x: CGFloat { return cgPoint.x }
var y: CGFloat { return cgPoint.y }
init(x: CGFloat, y: CGFloat) {
extension BidirectionalCollection where Iterator.Element: FloatingPoint {
func multiplied(by multiplier: Iterator.Element) -> [Iterator.Element] {
return map{$0 * multiplier}
}
var squared: [Iterator.Element] {
return map{$0 * $0}
}
struct Contact: CustomStringConvertible {
let user: User
let address: Address
let deliveryInstruction: String
let deliveryMethod: String
// customize the description to your needs
var description: String { return "\(user.name) \(deliveryInstruction) \(deliveryMethod)" }
init(dictionary: [String: Any]) {
self.deliveryInstruction = dictionary["delivery_instruction"] as? String ?? ""
self.deliveryMethod = dictionary["delivery_method"] as? String ?? ""
import UIKit
import MessageUI
class MailComposeViewController: MFMailComposeViewController, MFMailComposeViewControllerDelegate {
func mailComposeController(_ controller: MFMailComposeViewController, didFinishWith result: MFMailComposeResult, error: Error?) {
controller.dismiss(animated: true) {
switch result {
case .cancelled:
print ("Canceled")
case .saved:
import Foundation
// Swift 4.2.1 syntax
public struct SubstringMatchSource<S: StringProtocol> where S.Index == String.Index {
private let wrapped: S
public init(wrapping wrapped: S) {
self.wrapped = wrapped
}
@leodabus
leodabus / String+IntRange.swift
Last active August 30, 2020 17:55 — forked from zackdotcomputer/String+IntRange.swift
Range<Int> substring finder for Swift Strings - Unsafe but Simple
//
// String+IntRange.swift
//
// Created by Zack Sheppard on 8/30/20.
// Copyright © 2020 Zack Sheppard. All rights reserved.
// Freely usable under the Apache 2.0 License.
//
import Foundation
/// This extension is freely available at