1. Method
파라미터 이름 : 외부이름, 내부이름을 가짐
내부이름: 메소드 내부에서 사용될 지역변수 이름. 메소드 호출시 사용되는 것 아님
외부이름: 호출 시 호출하는 사람이 사용
외부이름을 지정하지 않으면 기본적으로 내부이름이 된다
func foo(externalFirst first: Int, externalSecond second: Double){
var sum = 0.0
for _ in 0...first { sum += second }
}
func bar(){
let result = foo(externalFirst: 123, externalSecond; 5.5)
}
외부이름을 사용하고 싶지 않으면 _ 사용
_는 default로 넣어주기 때문에 func foo(first : Int)로 지정시 foo(123)으로 호출 가능
func foo(_ first: Int, externalSecond second: Double){
var sum = 0.0
for _ in 0...first { sum += second }
}
func bar(){
let result = foo(123, externalSecond; 5.5)
}
메소드 오버라이딩 가능
메소드 오버라이딩이란 상위클래스서 정의된 메소드와 프로퍼티를 재정의 하는 것
func 또는 var 앞에 override 키워드 사용
final 처리 가능. 서브클래싱하지 못하도록(하위클래스에서 오버라이드 등을 통해 수정 불가)
타입과 인스턴스 모두 프로퍼티와 메소드 가질 수 있음
계산기 프로젝트에서 CalculatorBrain 인스턴스를 생성하고 인스턴스 메소드 사용
Double.abs(d) -> Double 클래스 안에 존재. Double 클래스에 호출한다는 뜻.
static func abs(d: Double) -> Double
이런것들은 보통 유틸리티 함수나 전역함수로 사용되며 클래스와 연관이 강할때 클래스 메소드로 넣어놓음
static 키워드를 사용
var d: Double = ...
if d.isSignMinus {
d = Double.abs(d)
}
2. Property
프로퍼티의 변화를 감시가능
set되기 전 후에 willSet, didSet 호출 - willSet(설정 전), didSet(설정 후)
newValue는 willSet에서 새로 설정될 값
oldValue는 didSet이 실행되면 전에 갖고 있던 값
저장 프로퍼티나 상속 프로퍼티, 계산프로퍼티에서 사용
willSet과 didSet은 값 타입을 바꿔도 호출됨
예를 들어서 인자가 Dictionary<String, Operation> 일 때 Operation에 값이 추가될 때 willSet, didSet이 불리게 됨
willSet과 didSet은 UI 업데이트시 많이 사용
var someStoredProperty: Int = 42 {
willSet { newValue is the newValue }
didSet { oldValue is the oldValue }
}
override var inheritedProperty {
willSet { newValue is the newValue }
didSet { oldValue is the oldValue }
}
Lazy Initialization
var가 늦게 초기화되도록 선언
예시의 CalculatorBrain은 누군가가 brain에 요청하기 전까진 할당되지 않음
brain에 누군가가 메시지를 보내거나 값을 할당하려고 할때 그때서야 초기화 됨
마지막 예시에서는 직접 메소드를 호출해서 초기화
이 때 보통 lazy없이는 잘못된 코드임. 전체적으로 초기화되기 전까지 자신에게 메시지를 보내거나 프로퍼티 접근 불가
lazy 키워드는 모든 변수가 초기화 되어야 한다는 요구조건을 충족함
늦게 초기화 된다 하더라도 모든 변수는 초기화되어야 한다는 규칙을 따름. 자주 초기화 함수를 작성하지 않아도 되게 해줌(init불필요)
var만 사용 가능하며 변수간 의존성에서 생기는 문제도 해결 가능.
다른변수에 의존하는 변수를 lazy로 작성해 미리 초기화된 변수를 부르도록 함
lazy var brain = CalculatorBrain()
lazy var someProperty: Type = {
return <the constructed value>
}()
lazy var myProperty = self.initializeMyProperty()
※ 이해가 잘 안가서 다른 블로그 참고 링크
https://velog.io/@leedool3003/iOS-lazy-Variable
https://baked-corn.tistory.com/45
결론적으로 메모리 관리가 lazy의 핵심이고 다중 스레드에서 접근하면 한번만 초기화되는 것이 보장되지 않는다고 한다.
객체생성 시 항상 사용하는 것이 아니라 사용하는 경우가 드문 경우에 사용.
'iOS' 카테고리의 다른 글
[스탠포드iOS] Swift 기초문법 정리(Optional, Tuple, Data Structure) (1) | 2024.03.16 |
---|---|
RxSwift(2) - 연산 (0) | 2020.04.04 |
RxSwift(1) (0) | 2020.04.03 |
MVVM패턴 (0) | 2020.04.02 |