목록전체 글 (30)
sanichdaniel의 iOS 개발 블로그
The Layout Cycle Layout은 Black Box일때가 많다. 뷰에 주어진 constraint으로부터 뷰에 프레임이 할당되기까지의 과정에 대해 알아보자 The Layout Cycle 1. Application Run Loop 이 돈다 2. Constraint가 변한다 Constraint 변하는 상황들에는 아래의 예시들이 있다. 1. activate or deactivate 2. setting constant or prioritiy 3. adding or removing views Constraint change가 발생하면 Layout Engine은 layout을 다시 계산한다 뷰들은 자신의 superview가 layout을 다시 그려야한다고 마킹하다 (superview.setNeedsLayo..
마틴 파울러의 리팩토링을 읽다가 리팩토링 기법중 하나인 함수를 추출하기 단원을 읽다가, 함수가 사용되는곳이 한곳에 불과하면 private 함수로 빼는것보다 중첩함수를 사용하는것이 유용하다는 글을 읽었다. 중첩함수를 한번도 사용해본적이 없었기에 공부해보았다. 중첩함수를 처음 보았을때는 낯설어서 못생겼다고 생각을 했었다. 하자만 공부해보니 중첩함수는 가독성과 캡슐화의 측면에서 이점이 있다. 가독성 private 함수는 클래스(또는 파일)에서 접근이 가능하다. 하지만 중첩함수는 해당 함수안에서만 사용된다는것이 보장된다. public namespace를 줄이려고 private 키워드를 사용하듯, private namespace를 줄이기 위해 중첩함수를 사용해보자. 캡슐화 중첩함수는 소속된 함수의 지역변수에 접근..
value 타입에 관한 WWDC 영상을 참고하여 새로알게된 사실들을 정리해보았다. 배경지식 value type vs reference type value type: 값이 복사될때 (할당, 생성, 인자로 넘겨질때) 매번 독립적인 인스턴스를 만든다. reference type: 값이 복사될때 참조가 복사되고 인스턴스는 공유된다 heap stack 어디 저장되나 Referenct 타입은 heap에 저장되고, 포인터(참조)는 stack에 저장된다. value type이 class에 포함되거나 closure에 캡쳐되면 heap에 저장된다. Reference 타입은 항상 heap에 저장, value 타입은 자신이 선언된곳에 저장된다. Local Reasoning 강의 초반에 Local Reasoning이란 term..
expressions(수식) 값을 리턴하는 코드 let someValue:Int = 12 if true && false { print("This is false") } 여기에 들어간 expression은 let someValue:Int = 12 true && false "This is false" statement(문장) 어떠한 작업을 수행하는 모든 문장 Swift에서는 크게 3가지 종류로 statement를 구분한다 expression은 값을 리턴하는 statement라 볼 수 있다 1. simple statements expression이나 선언 2. compiler control statements #if 3. control flow staements if 문, guard문, for 문.. lite..
Swift의 타입추론은 양방향으로 이루어진다고 한다. 알아보자 Bottom-up 타입 추론 타입 정보가 leaf에서 root으로 전달되는것 var x = 0 literal 0을 보고 x의 타입을 Int로 추론한다. (정수의 literal의 기본 타입은 Int이다.) leaf인 literal이 root인 변수의 타입을 결정한다. let age = 26 // age is of type Int let name = "Toni" // name is of type String let pair = (age, name) // pair is of type (Int, String) pair 튜플의 타입은 (age, name)의 타입으로부터 결정이 된다. 타입체커는 age, name을 코드에서 찾는다. 즉 root인 pai..
Operator Overloading Class, struct는 기존에 존재하는 operator에 대한 자신만의 구현을 제공할수 있다. 이것을 operator overloading이라 한다. operator은 +, -, *, /, %, = 같은 심볼들로 값을 체크하거나, 수정, 합치는데 사용된다 함수를 사용하는것보다 더 간결하게 코드를 표현할수 있을때 사용된다 Equatable 프로토콜 구현이 사실 operator overloading이었다! 출처 www.hackingwithswift.com/example-code/language/how-to-use-operator-overloading
빌드 타임이 어디서 오래걸리는지 측정해보았다. Build Settings의 “Swift Compiler - Custom Flags”, “Other Swift Flags” 에서 -Xfrontend -warn-long-expression-type-checking= 옵션을 추가해주고 빌드해본 결과 == 비교 연산자를 사용하는곳에서 warning이 많이 나왔다. 비교 연산자 타입추론이 오래 걸리는 이유? 비교 연산자 == 은 수많은 곳에서 overload되는 operator이다. (overload: 같은 이름의 다른 메서드들) swift standard library에서만 73곳에서 overload되고 있고, 커스텀하게 만든 타입들에서도 자주 overload 된다. operator는 글로벌 함수처럼 호출되기에,..
Pure function 이란? 1. 같은 인자라면, 같은 리턴 값 (외부에 의존하지 않는다) 2. 사이드 이펙트가 없다 장점 1. 재사용성, 테스트하기 쉬위짐 2. 사이드 이펙트가 적음 함수를 pure하게 만들기 1. 값을 바꾸지 말고, 새로운 값을 리턴하자 extension String { mutating func addSuffixIfNeeded(_ suffix: String) { guard !hasSuffix(suffix) else { return } append(suffix) } } 아래 함수는 값을 mutate 하기에 pure 하지 않다 mutable 값에만 호출할수 있게되고 더러운 var muate assign 코드가 필요해진다. var fileName = contentName fileName..
Currying 여러 인자를 받는 함수를 하나의 인자만 받는 함수들의 시퀀스로 변환하는 것입니다. 변환된 함수는 인자 하나를 받고, 값 대신 함수를 리턴한다. 이 리턴되는 함수는 다음 인자를 입력으로 받는다. 예시 1 func add2(_ x: Int, _ y: Int) -> Int { return x + y } add2(1, 2) func add2Currying(_ x: Int) -> ((Int) -> Int) { return { y in return x + y } } add2Currying(1)(2) 예시 2 func curry(_ fn: @escaping (A, B) -> C) -> (A) -> (B) -> C { return { (a: A) in return { (b: B) in return fn..
swift에서 함수는 일급 시민이다라는 말은 여러번 들어보았지만, 정작 일급 시민 개념에 대해 완전히 모르는것 같아 공부해보았다. 일급 시민 (First-class Citizen) 다른 객체들에 일반적으로 적용 가능한 연산을 모두 지원하는 객체를 가리킨다. 1. 함수의 인자로 전달 2. 함수에 의해 리턴 3. 변수에 할당 가능 4. 비교 연산이 가능 일급 함수 (First-class Function) 함수를 일급 시민으로 취급하는것 High Order Function 함수를 인자로 받거나, 함수를 리턴하는 함수 함수가 일급 시민인 언어에서, high order function이 가능하다는것이 보장된다. -> 함수를 인자로 받거나 리턴할수 있기에 high order function이 가능하다고 함수가 일급..
목차 Strategy Command Adapter Proxy Facade Template Method Decorator Factory Abstract Factory Mediator Compostie Strategy 동작(Strategy)을 클래스로 캡슐화하고 런타임에 갈아끼울수 있도록 하는것 동작이 사용하는 코드로부터 캡슐화 되어있다. 새로운 동작을 쉽게 추가할수 있다. Context는 새로 추가되는 동작에 대해 몰라도 된다. 아래 예시에서 Restaurant는 Cook 구현체에 대해 닫혀있다. import Foundation protocol Cook { func cookFood() } class KoreanCook: Cook { func cookFood() { print("김치찌개") } } class..
요약 Identifiable, ObjectIdentifier, Equality, Identity 개념들을 묶어서 정리해보았다 Identifiable A class of types whose instances hold the value of an entity with stable identity. public protocol Identifiable { /// A type representing the stable identity of the entity associated with `self`. associatedtype ID : Hashable /// The stable identity of the entity associated with `self`. var id: Self.ID { get } } Ob..