Introducing TelegraphKit by Nice Photon

Screenshot of the web article displayed in the iOS App via TelegraphKit

Introducing DateBuilder by Nice Photon

The best way to debug your local notifications

Most apps do it wrong. Learn how to stand out!

One simple trick to avoid unintentionally leaking your users private info

struct User {
var identifier: String
var handle: String
var name: String
var dateOfBirth: Date
var city: String
func logError(_ description: String, userInfo: Any...) {
// ...
logError("trying to edit the user that…

Ready for some property wrappers?

final class TextField {
var didUpdate: (String) -> ()…

Picture found at FindDoc

Let’s talk about closure-based delegation, retain cycles and generics

  1. First, we create a delegate protocol restricted to classes
protocol ImageDownloaderDelegate: class {    func imageDownloader(_ imageDownloader: ImageDownloader, didDownload image: UIImage)}
class ImageDownloader {

weak var delegate: ImageDownloaderDelegate?

func downloadImage(for url: URL) {
download(url: url) { image in
self.delegate?.imageDownloader(self, didDownload: image)


You should not treat every piece of data the same way. Here’s why

let user = persistence.getUser(for: id)
label.text =

Folder of your iOS app — friendly and strongly-typed

Oleg Dreyman

iOS development know-it-all, Co-founder at Talk to me about Swift, coffee, photography & motorsports.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store