SWIFT
[Swift] Final
문법적 의미 더 이상의 상속을 불가능하게 한다. class 앞에 final이 붙게되면 다른 class에서 상속이 불가능해진다. 프로퍼티 메서드 등에 final이 붙게되면 재정의가 불가능해진다. 성능적 이점 런타임 시기에 성능적 이점을 가질 수 있다. 이를 얻게되는 방식은 Virtual Table을 먼저 알아야하며 Static Dispatch방식과 Dynamic Dispatch의 차이를 알아야한다. https://clamp-coding.tistory.com/364 [Swift]. Method Dispatch Method Dispatch 실제로 Method는 CPU에대한 명령어이며, 실제론 코드 영역에만 존재한다. 그렇기 때문에 코드 영역에 있는 메서드를 실행시키려면 메서드 주소가 필요하다. 그런데 그 메서..
[Swift] @propertyWrapper(프로퍼티 래퍼)
@Property Wrappers property wrapper는 속성 저장 방법을 관리하는 코드와 속성을 정의하는 코드 사이에 구분 계층을 추가한다. 예를 들어, 쓰레드 안전성 검사를 제공하거나. 자신의 실제 자료를 데이터베이스에 저장하는 속성이 있다면, 모든 속성에 대해 그 코드를 작성해야 한다. 프로퍼티래퍼를 사용할 땐, 래퍼를 한 번 작성하면 여러 속성에 적용함으로써 관리 코드를 재사용한다. 프로퍼티 래퍼를 정의하기 위해 wrappedValue 프로퍼티를 정의한 구조체, 열거형 또는 클래스를 만든다. TwelveOrLess구조체는 래핑하는 값이 항상 12와 같거나 더 작은 숫자가 저장된다는 것을 보장한다. . 더 큰 숫자를 저장하면 12를 대신 저장한다. @propertyWrapper struct..
[Swift] Properties(속성)
Stored Properies (저장속성) 가장 단순한 형식의 저장속성은 클래스나 구조체 인스턴스의 일부분인 상수, 변수이다. 저장속성은 var를 사용하면 변수, let을 사용하면 상수 저장속성이다. 저장속성(변수, 상수)은 기본값(default value)를 가질 수 있다. struct FixedLengthRange { var firstValue: Int let length: Int } var rangeOfThreeItems = FixedLengthRange(firstValue: 0, length: 3) // the range represents integer values 0, 1, and 2 rangeOfThreeItems.firstValue = 6 // the range now represents ..
[Swift] available 키워드
@available 타입, 속성, 메서드 앞에 사용 @available(iOS 10.0) // iOS 10.0 에서만 적용되는 클래스 class Myclass{} @available(iOS 11.0, *)// iOS 11.0 이상에서만 doSomething이란 함수가 있다고. func doSomething(){} 앱이 업데이트 되거나 하면 iOS버전에 따라서 적용이 되는 기능이 생길 수 있다. 이런 경우에 에러의 발생을 막기 위해 사용한다. #available 조건문( if / guard / while ) 문에서 사용 if #avilable(iOS 11.0, *){ //iOS ii.0이상에서는 여기 } else { // 이외에서는 여기 }
[Swift] #selector(셀렉터)
#selector 메서드 주소를 통해 메서드를 가리키기 위한 기술 물론 메서드 주소를 통해 메서드를 호출할 순 없다. 단순하게 메서드를 가리키는 것? 셀렉터는 속성에 접근이나 메서드를 호출하는게 아니다. 가리키기만 한다. 코드 영역의 메모리 주소를 가리켜서, (버튼이 눌렸을 때 해당 메서드를 실행시키기 위해) 연결시키는 기술 클래스와 Objective-C 프로토콜에 포함된 멤버에만 적용 가능하다. 구조체는 적용이 불가능하다. 내부적으로 Objective-C프레임워크를 사용하고 있다. @objc 특성을 추가해야지만 사용 가능하다. #selector( 메서드 ) 셀렉터 내부에 메서드를 명시하게되면 해당 메서드를 가리키게 되고 이를 변수에 할당하면 셀렉터 구조체가 생성된다. 소스코드를 통한 이해 class D..
[Swift] #keyPath
#keyPath와 #selector는 문법적인 내용이 아닌 Framework와 관련된 내용이다. objc부터 쓰이던 기술임에도 불고하고 여전히 쓰이던 내용이다. framework 내부적인 메커니즘에 여전히 objc를 떼어놓고 사용할 수 없는 몇 가지 기술들이 있기 때문에 여전히 쓰인다. 물론 버려져야함.. #keyPath person.name ⬇️ "person.name" or person["name"] 이런식으로 접근하면 안될까? 키경로(문자열처럼 쉽게 만들 수 있는 인스턴스)/ 문자열로 속성에 접근하는 것이 편하지 않을까? 라는 생각으로 시작된 문법?? 이런 문법이 필요한 예를 들어보자. class Restaurant{ var name: String var affiliate: Snack init(na..
[Swift] 디버깅(테스트/검증)함수 assert, precondition
디버깅(테스트/검증)함수 앱을 테스트 하면서, 런타임동안 발생할 수 있는 여러 버그의 가능성, 잘못된 코드의 검증등을 수행하도록 도와주는 함수 print(), dump() 일종의 디버깅 함수이다. 어떤 코드들이 입력되는지 콘솔창을 통해 확인/검증 할 수 있으므로. 디버깅 함수 assert() assertionFailure() precondition() preconditionFaulure() fatalError() assert() ➡️ 실제 앱을 출시시, 일부러 앱을 종료시켜야하는 상황은 아니지만, 디버그 모드에서 검증 예) 레이블에 20 % / 30% /... 100% 표시한다고 했을때, -10%라고 표시된다고 굳이 앱을 종료시켜야 하는가? precondition() ➡️ 실제 앱을 출시시에도 앱을 의도..
[Swift] Never타입과 fatalError()
Never 타입 제어권을 호출한 위치로 return하지 않는다. Never타입은 빈 열거형으로 선언되어있다. 빈 열거형이므로 인스턴스를 생성할 수 없다 ex) let day: Weekday = Weekday.monday // 인스턴스 생성 불가 let some = Never() // 생성 불가 ⭐️함수의 return의 의미⭐️ 함수의 결과로 만들어진 값을 리턴한다. 함수 내부로 전달된 CPU실행의 제어권을 함수를 호출한 부분으로 돌려준다. ❓일반적인 함수의 흐름 //코드위치 func addTwoNumbers(a: Int, b: Int) -> Int { //1 var c = a + b //2 return c //3 } //@main var num1 = 5 //4 var num2 = 3 //5 var num..
[Swift] CaseIterable 프로토콜
Enum 타입에서 사용할 수 있는 프로토콜이다 (Swift 5.2~) Iterable: 반복가능한 💥CaseIterable 채택시 아래의 타입 계산 속성이 자동으로 구현된다. static var allCases: Self.AllCases { get } 연관값이 있는경우 CaseIterable 프로토콜을 따르지 않아 구현할 수 없다.⭐️⭐️⭐️⭐️ ❗️원시값은 상관없음 구글링 해보면 방법이 있긴 하다고한다 😅 ❓allCases 타입 계산속성은 뭘 하는 놈일까? CaseIterable을 채택한 열거형의 모든 케이스를 가지고 있는 배열 CaseIterable 구현 예제 enum CompassDirection: CaseIterable { case north case south case east case west..
[Swift] Comparable 프로토콜
Equatable 프로토콜과 유사하다. 두 인스턴스에 대하여 아래의 연산자를 가능케한다. , = Comparable 프로토콜의 요구사항 static func Bool Equatable //클래스의 경우 ==는 무조건 구현해야함 static func == (lhs: Some, rhs: Some) -> Bool //다른 커스텀 타입의경우 모든 멤버가 Equatable을 따르다면 구현하지 않아도 됨 일반적으로 , = 연산자를 자동으로 구현해준다. Comparable 프로토콜은 Equatable프로토콜을 상속하고 있다. 그러므로 == 또한 구현해야한다. Int, Double, String 등은 Complable을 채택하고 있기 때문에 비교 연산이 가능하다 Com..