Skip to content

Instantly share code, notes, and snippets.

View strzempa's full-sized avatar

Patryk Strzemiecki strzempa

View GitHub Profile
@DaveWoodCom
DaveWoodCom / String+Email.swift
Last active February 28, 2021 16:45
Swift method to check for a valid email address (uses Apples data detector instead of a regex)
extension String {
func isValidEmail() -> Bool {
guard !self.lowercaseString.hasPrefix("mailto:") else { return false }
guard let emailDetector = try? NSDataDetector(types: NSTextCheckingType.Link.rawValue) else { return false }
let matches = emailDetector.matchesInString(self, options: NSMatchingOptions.Anchored, range: NSRange(location: 0, length: self.characters.count))
guard matches.count == 1 else { return false }
return matches[0].URL?.scheme == "mailto"
}
}
@brennanMKE
brennanMKE / Async.swift
Last active March 6, 2023 13:01
Blocking with Semaphores and DispatchGroups in Swift
import PlaygroundSupport
import Foundation
class Worker {
private let queue = DispatchQueue.global(qos: .background)
private let serialQueue = DispatchQueue(label: "com.acme.serial")
public private(set) var count = 0
func incrementCount() {
@freak4pc
freak4pc / Combine+WithLatestFrom.swift
Last active February 19, 2024 15:35
withLatestFrom for Apple's Combine
//
// Combine+WithLatestFrom.swift
//
// Created by Shai Mishali on 29/08/2019.
// Copyright © 2019 Shai Mishali. All rights reserved.
//
import Combine
// MARK: - Operator methods
@strzempa
strzempa / ProgressObservableWebViewController.swift
Last active October 11, 2019 05:22
WKWebViewController with secure progress observation, progressView and activityIndicatorView
import UIKit
import WebKit
open class ProgressObservableWebViewController: UIViewController, WKWebViewProgressObservable {
@IBOutlet weak public var webView: WKWebView!
public var webViewProgressObservation: Any?
private let progressView: UIProgressView = {
let view = UIProgressView(progressViewStyle: .default)
import Foundation
public extension UIApplication {
class func tryURL(_ urls: [String]) {
let application = UIApplication.shared
urls.forEach { urlString in
guard let url = URL(string: urlString) else {
Logger.error?.message("Cannot make url from: \(urlString)")
return
}
import UIKit
public protocol UITableViewHeaderFooterViewIdentifiable: UITableViewHeaderFooterView {
static var identifier: String { get }
}
public extension UITableViewHeaderFooterViewIdentifiable where Self: UITableViewHeaderFooterView {
static var identifier: String {
return String(describing: self)
}
@KaQuMiQ
KaQuMiQ / Cryptor.swift
Last active March 7, 2023 08:24
EasyAES
import Foundation
import CommonCrypto
internal enum CryptoError: Error {
case emptyData
case invalidData
case invalidKey
case fail(status: CCStatus)
}
@KaQuMiQ
KaQuMiQ / Command
Created March 17, 2020 09:58
Swift LLDB pretty print json data
e print(String(data: JSONSerialization.data(withJSONObject: JSONSerialization.jsonObject(with: data, options: []), options: .prettyPrinted), encoding: .utf8)!)
@KaQuMiQ
KaQuMiQ / UITextView+Lines.swift
Created March 19, 2020 18:46
Number of text lines in UITextView
extension NSLayoutManager {
var numberOfLines: Int {
var linesCount: Int = 0
var idx: Int = 0
let lineRange: NSRangePointer = .allocate(capacity: 1)
while idx < numberOfGlyphs {
lineFragmentRect(forGlyphAt: idx, effectiveRange: lineRange)
idx = NSMaxRange(lineRange.pointee)
linesCount += 1
}
@KaQuMiQ
KaQuMiQ / TextView.swift
Created March 19, 2020 18:56
Autoresizing text view
import UIKit
public final class TextView: UITextView {
public override init(frame: CGRect, textContainer: NSTextContainer?) {
super.init(frame: frame, textContainer: textContainer)
layoutManager.delegate = self
isScrollEnabled = false
}