-
Swift MVVM(작성중)
스탠포드 대학 CS193p 강의 중 MVVM 관련 내용을 번역하며 정리해봄 Model-View-ViewModel 코드를 구성하는 아키텍쳐의 디자인 패러다임의 하나이다. “반응형” 유저인터페이스 개념과 함께 작동하며, SwiftUI를 학습하기 전에 선행되어야 하는 개념이다. UIKit을 사용하는 구식 스타일 iOS의 MVC와는 다르다. MVVM은 모델과 뷰를 분리하려고 한다는 점에서 MVC와 비슷한 면이 있다. 모델과 뷰를 먼저 살펴본 후 MVVM이 이 두 요소를 어떻게 연결하는지 알아보도록 하자. Model 과 View Model 모델은 UI 독립적이다. 모델은 SwiftUI를 사용하지 않는다. (UIKit도) 모델은 데이터와 로직을 캡슐화 한다....
-
qtfaststart in Swift
mp4 파일중 스트리밍이 지원되지 않는 파일이 존재하였고, 이를 최적화 시켜주는 C라이브러리를 Swift로 컨버젼했음 Mp4 atoms mp4 파일 중 스트리밍이 되지 않는 파일들이 존재하는데, 이는 mp4 파일을 구성하는 요소인 atom 배치에 따른 것이었다. 데이터를 담고있는 mdat atom과 데이터에 대한 정보를 담고 있는 moov atom의 순서에 따라 스트리밍 가능 / 불가능 여부가 결정되는데, 스트리밍이 가능한 mp4는 moov atom이 mdat atom보다 앞에 배치되어 있었고, 스트리밍이 불가한 mp4는 moov atom이 파일의 가장 뒷부분에 붙어있었다. 이를 수정하여 mp4를 스트리밍해줄 수...
-
Arrange Multi-line UILabel in UIStackView with SnapKit
Multi Line UILabel을 UIStackView 안에서 정렬하기 위한 방법 정리 방법 UILabel을 UIView안에 넣고, UIView를 UIStackView에 넣으면 된다. 코드 class ExampleView: UIView { private lazy var titleLabel = UILabel() private lazy var contentLabel: UILabel = { let label = UILabel() label.numerOfLines = 0 return label }() private lazy var contentView: UIView = { let view = UIView() view.addSubview(self.contentLabel) return view }() private lazy var spacer: UIView = { let view = UIView() view.setContentHuggingPriority(.defaultLow, for: .horizontal) return...
-
[Swift-Design Pattern] 데코레이터 패턴 (Decorator pattern)
데코레이터 패턴이란 객체간 결합을 통해 기능을 유연하게 확장할 수 있도록 돕는 디자인 패턴이다. 예시 네비게이션의 도로 표시 방식을 통해 데코레이터 패턴을 학습해 본다. AS-IS 도로 표시 클래스 class RoadDisplay { func draw() { print("기본 도로 표시") } } draw()를 이용해 기본적인 도로만 표시하는 클래스이다. 도로 + 차선 표시 클래스 class RoadDisplayWithLane: RoadDisplay { override func draw() { super.draw() self.drawLane() } private func drawLane() { print("+ 차선 표시") } } draw()를 호출하면 차선도 함께 표시해주는 클래스이다....
-
[Swift-Design Pattern] 커맨드 패턴 (Command pattern)
Command Pattern은 실행될 기능을 추상화, 캡슐화 하여 한 클래스에서 여러 기능을 실행할 수 있도록 하는 패턴이다. 예시 여러 기능을 수행할 수 있는 버튼 클래스를 만들며 커맨드 패턴을 익혀본다. AS-IS 버튼 클래스와 램프 클래스 class Lamp { func turnOn() { print("Lamp On") } } class Button { private let lamp: Lamp init(lamp: Lamp) { self.lamp = lamp } func pressed() { self.lamp.turnOn() } } Button을 생성할 때 lamp를 인자로 전달받도록 작성되었다. 클라이언트 let lamp = Lamp()...
-
[Swift-Design Pattern] 옵저버 패턴 (Observer pattern)
Observer Pattern은 한 객체의 상태 변화에 따라 다른 객체의 상태도 연동 되도록 1 대 N 객체간 의존 관계를 구성하는 디자인 패턴이다. 예시 점수 저장소인 ScoreRecord 클래스와 점수를 출력하는 View 클래스를 이용해 옵저버 패턴을 이해해 본다. AS-IS 점수 저장 클래스 class ScoreRecord { private var scores = [Int]() private var dataSheetView: DataSheetView? func setDataSheetView(dataSheetView: DataSheetView) { self.dataSheetView = dataSheetView } func addScore(_ score: Int) { self.scores.append(score) self.dataSheetView?.update() } func getScoreRecord() -> [Int] { return self.scores }...
-
[Swift-Design Pattern] 싱글톤 패턴 (Singleton Pattern)
Singleton Pattern은 객체를 하나만 생성하여, 생성된 객체를 어디서든 참조할 수 있도록 하는 패턴이다. Thread-safe 하게 작성하여 멀티스레드에서 사용해도 문제가 없어야 한다. JAVA와는 다르게, Swift에서는 간결하게 구현이 가능한 듯 하다. 코드 클래스 class Printer { static let shared = Printer() private init() {} func printDoc(_ doc: String) { print(doc) } } static 변수에 Singleton 패턴을 적용할 클래스의 인스턴스를 할당해주면 된다. 클라이언트 Printer.shared.printDoc("Print Document") 클라이언트에서는 Printer 클래스의 shared 변수를 불러와 사용하면 된다.
-
[Swift-Design Pattern] 스트래티지 패턴 (Strategy pattern)
Strategy Pattern은 클래스의 행위를 캡슐화 하여 동적으로 행위를 자유롭게 바꿀 수 있도록 돕는 패턴이다. 예시 로봇 프로토콜과 그것을 따르는 태권V, 아톰 객체를 생성하는 예시를 통해 스트래티지 패턴을 학습해본다. AS-IS Robot 클래스 protocol Robot { var name: String { get } init(name: String) func attack() func move() } class TaekwonV: Robot { var name: String required init(name: String) { self.name = name } func attack() { print("I launch Missle") } func move() { print("I can only...