Git Hub
коротко
90 заметок с тегом

Swift

Ctrl + ↑ Позднее

Интеграция SpriteKit

12 июля 2017, 12:12

шаг первый
в ViewController пишем

шаг второй в stoyboard у главной view указываем тип SKView

SpriteKit   Swift

For Base Controller

5 июля 2017, 14:58

Size Of Screen

var screenSize: CGSize {
        return UIScreen.main.bounds.size
    }
Swift

Код Стайл

3 июля 2017, 11:53

Код Стайл

Код Стайл

Swift

Версия приложения

19 июня 2017, 15:47

let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String
        let build = Bundle.main.infoDictionary?["CFBundleVersion"] as! String

пишем расширение

extension UIApplication {
    func getVersion() -> String {
        let version = Bundle.main.infoDictionary?["CFBundleShortVersionString"] as! String
        let build = Bundle.main.infoDictionary?["CFBundleVersion"] as! String
        return "\(version).\(build)"
    }
}

применение

...
UIApplication.shared.getVersion()
...
Swift

Date

16 июня 2017, 18:25

Дату из текущей + N дней

extension Date {
    func dateFromDays(_ days: Int) -> Date {
        return (Calendar.current as NSCalendar).date(byAdding: .day, value: days, to: self, options: [])!
    }
}
let startDate = Date()
let endDate = startDate.dateFromDays(+10)
Swift

Custom action in UITableViewCell

15 июня 2017, 23:59

func tableView(_ tableView: UITableView, editActionsForRowAt indexPath: IndexPath) -> [UITableViewRowAction]? {
       
        let share = UITableViewRowAction(style: .normal, title: "Share") { action, index in
            print("share button tapped")
        }
        share.backgroundColor = UIColor.blue
        
        let deleteAction = UITableViewRowAction(style: .default, title: "Del") {action, index in
            self.deleteRow(index)
        }
        
        deleteAction.backgroundColor = .red
        return [deleteAction, share]
    }
Swift

Realm

14 июня 2017, 13:36
let uiRealm = RealmHelper.shared
                if let currentTaskList = self.taskList {
                    try! uiRealm.write { ()->Void in
                          currentTaskList.tasks.append(newTask)
                    }
                }
Realm   Swift

NFC Reader

14 июня 2017, 9:43
https://github.com/hansemannn/iOS11-NFC-Example
NFC   Swift

SnapKit

14 июня 2017, 2:03

https://medium.com/cocoaacademymag/how-to-write-auto-layout-constraints-with-snapkit-in-ios-c5f95c7c695d

func setupConstraints(){
        uiLogo.snp.makeConstraints{ set in
            set.width.equalTo(AppStyles.About.logoSize)
            set.height.equalTo(AppStyles.About.logoSize)
            set.top.equalToSuperview().offset(AppStyles.About.offsetTop)
            set.centerX.equalToSuperview()
        }
        
        uiVersion.snp.makeConstraints{set in
            set.top.equalTo(uiLogo.snp.bottom).offset(AppStyles.About.offetBottom)
            set.centerX.equalToSuperview()
        }
        
        uiBack.snp.makeConstraints{make in
            make.width.equalTo(AppStyles.About.backSize)
            make.height.equalTo(AppStyles.About.backSize)
            make.centerX.equalToSuperview()
            make.bottom.equalToSuperview().offset(-AppStyles.About.offetBottom)
        }
    }
SnapKit   Swift

Множественные аргументы метода

6 июня 2017, 20:10

Multi, Мульти аргументы

typealias Person = (id: Int, name: String)

class Persons{
    var items:[Person] = []
    func add(_ persons: Person...){
        persons.forEach{id,name in
            print("id: \(id) name: \(name)")
        }
    }
}
Persons().add(
   (1,"Yuriy"),
   (2,"Vadim"),
   (3,"Anastasya")
)
Swift

Трюк использования #function

6 июня 2017, 18:27

UserDefaults

let isInstalledErlier = UserDefaults.standard.bool(forKey: "isInstalledErlier") ?? false
        
        if isInstalledErlier {
            
            UserDefaults.standard.set(true, forKey: "isInstalledErlier")
        }

Если создать расширение для UserDefaults

extension UserDefaults {
    var isInstalledErlier: Bool {
        get { return bool(forKey: #function) }
        set { set(newValue, forKey: #function) }
    }
}

то использовать будет проще

if UserDefaults.standard.isInstalledErlier == false {
            // тут какой-то полезный код
            UserDefaults.standard.isInstalledErlier = true
        }

Пример

extension UserDefaults {
    var firstLaunch: Bool {
        get { return bool(forKey: #function) }
        set { set(newValue, forKey: #function) }
    }
}
extension UserDefaults {
    var isActivated: Bool {
        get { return bool(forKey: #function) }
        set { set(newValue, forKey: #function) }
    }
    
    var appName: String {
        get { return string(forKey: #function)! }
        set { set(newValue, forKey: #function) }
    }    
}
UserDefaults.standard.appName = "Tinder"
Swift

(Обсуждение) Вопросы собеседований на Junior Developer

3 июня 2017, 13:59

Темы для собеседований:

  1. Простые типы и алгоритмы работы с ними
  2. Многопоточность (MultiThreading)
  3. Жизненный цикл MVC
  4. Runloop
  5. CoreData

Простые типы и алгоритмы работы с ними

обычно, эта тема называется Структуры данных и алгоритмы

Связанный список
Стек
Очередь

Вопросы и ответы

Swift

RxSwift

1 июня 2017, 0:04

RxGesture

labelView.rx
            .anyGesture(.longPress())
            .when(.began)
            .subscribe(onNext: {_ in
            //react to long Press
                UIView.animate(withDuration: 1, animations: {
                    self.labelView.bounds.size.width = 200
                }, completion: { ok in
                    self.labelView.bounds.size = self.sizeOfButton
                })
                print("long press")
        }).addDisposableTo(disposeBag)

UISwitch

var uiDone = UISwitch()

        uiDone.rx.isOn
            .subscribe(onNext: { isOn in
                print( isOn ? "it's ON" : "it's OFF" )
                
                try! self.uiRealm.write { ()->Void in
                    self.taskModel.isCompleted = isOn
                }
                
            }).addDisposableTo(disposeBag)
Swift

UIPanGestureRecognizer PanGesture

28 мая 2017, 20:08

вот и всё что нужно чтобы повесить PanGesture программно, просто пишем его кодом

func setupGestures(){
        let pan = UIPanGestureRecognizer(target: self, action: #selector(actionPan(_:)))
        scaleView.addGestureRecognizer(pan)
    }

сам обработчик касания

func actionPan(_ sender:UIPanGestureRecognizer){
        let moving = sender.translation(in: self)
        print("Pan Action: \(moving)")
        let toPoint = CGPoint(x: scaleView.center.x + moving.x, y: scaleView.center.y + moving.y)
    
        scaleView.center = toPoint
        sender.setTranslation(CGPoint(x: 0, y: 0), in: self)   
    }
Gestures   Swift

@discardableResult

28 мая 2017, 19:27

полезный модификатор возвращаемого типа, если не всегда хотим получать warning при вызове функции, не обрабатывая её результат

@discardableResult func getItem(x:Int) -> Int {
        return x*x
    }
getItem()
Swift

пример кода с CocoaHeads Май 2017 Alexander Zimin

21 мая 2017, 13:08
protocol CellViewAnyModel {
  static var cellAnyType: UIView.Type { get }
  func setupAny(cell: UIView)
}

protocol CellViewModel: CellViewAnyModel {
  associatedtype CellType: UIView
  func setup(cell: CellType)
}

extension CellViewModel {
  static var cellAnyType: UIView.Type {
    return CellType.self
  }

  func setupAny(cell: UIView) {
    if let cell = cell as? CellType {
      setup(cell: cell)
    } else {
      assertionFailure("Wrong usage")
    }
  }
}

extension UITableView {
    func dequeueReusableCell(withModel model: CellViewAnyModel, for indexPath: IndexPath) -> UITableViewCell {
        let indetifier = String(describing: type(of: model).cellAnyType)
        let cell = self.dequeueReusableCell(withIdentifier: indetifier, for: indexPath)
        
        model.setupAny(cell: cell)
        return cell
    }
    
    func register(nibModels: [CellViewAnyModel.Type]) {
        for model in nibModels {
            let identifier = String(describing: model.cellAnyType)
            let nib = UINib(nibName: identifier, bundle: nil)
            self.register(nib, forCellReuseIdentifier: identifier)
        }
    }
    
}
Swift

Как получить имя класса из статического метода ?

20 мая 2017, 19:50

вариант 1

через рефлексию

static func getEntityName() -> String {
        return String(describing: Mirror(reflecting: self).subjectType).components(separatedBy: ".").first!
    }

вариант 2

немного устаревший вариант

static func getEntityName() -> String {
        return NSStringFromClass(self).components(separatedBy: ".").last!
    }
Swift

Кодогенерация — это просто

11 мая 2017, 12:23

Sourcery

Пример файла настроек для генерации

sources:
  - src/
templates:
  - Templates/
output:
  out/
args:

у ключей sources и templates обязательно должны стоять символы 

В качестве шаблонизатора используется Stencil

для кастомизации имён генерируемых файлов можно использовать спец теги // sourcery:file:

// sourcery:file:TemplateName.swift
 ... какой-то наш код
// sourcery:end

пример:

// sourcery:file:TemplateName.swift
// template of UIView

import UIKit

class EventModelView: UIView, EventProtocol {
	
}

// sourcery:end
// sourcery:file:Views/TemplateName2.swift
// template of UIView

import UIKit

class EventModelView2: UIView, EventProtocol {
	
}

// sourcery:end
Sourcery   Swift

Parallax Effect with Motion Device

8 мая 2017, 14:54

Формула Parallax

var parallaxImageHeight: CGFloat {
let maxOffset = (sqrt( cellHeight * cellHeight + 4 * parallaxSpeed * self.tableView.frame.height) - cellHeight) / 2
return maxOffset + self.cellHeight
}
Animation   Swift

Необычная анимация

8 мая 2017, 14:51
Animation   Swift
Ctrl + ↓ Ранее