가끔 함수의 매개변수로 몇개가 들어오는지 정해줄 수 없는 경우가 있는데,
이런 경우, 우리는 가변 매개변수를 사용할 수 있다.
func sum(_ numbers: Int...) -> Int {
return numbers.reduce(0, combine: +)
}
그리고 세가지 특징
0개 이상
의 값을 받아올 수 있다배열
처럼 사용 가능하다 (subscript) index로 접근하나씩
만 가질 수 있다함수의 전달인자로 값을 전달할 때는 보통 값을 복사해서 전달한다. 하지만, 값이 아닌 참조를 전달하려면 입출력 매개변수를 사용해야 한다
var arrays: [Int] = [1, 2, 3, 4, 5]
func referenceParameter(_ arr: inout [Int]) {
arr[0] = 10
}
referenceParameter(&arrays)
print(arrays) // [10, 2, 3, 4, 5]
구조체, 클래스 공통점
프로퍼티
를 정의메서드
를 정의할 수 있다서브스크립트
문법을 통해 구조체 또는 클래스가 갖는 프로퍼티에 접근하도록 서브스크립트
를 정의할 수 있다이니셜라이저
를 정의할 수 있다익스텐션
을 통해 확장할 수 있다프로토콜을 준수
할 수 있다구조체, 클래스 차이점
구조체는 상속
x
타입캐스팅
은 클래스 인스턴스에서만 허용
디이니셜라이저
는 클래스의 인스턴스에서만 활용할 수 있다
참조 횟수 계산
은 클래스의 인스턴스에만 적용
구조체 = 값 타입
, 클래스 = 참조 타입
Apple Guidelines 에 나오는 구조체를 권장하는 조건
- 연관된 간단한 값의 집합을 캡슐화하는 것만이 목적일 경우
- 캡슐화한 값을 참조하는 것보다 복사하는 것이 합당할 때
- 구조체에 저장된 프로퍼티가 값타입이며 참조하는 것보다 복사하는 것이 합당할 때
- 다른 타입으로부터 상속받거나 자신을 상속할 필요가 없을 때
이런 몇가지 상황을 제외하면 거의 클래스로 정의한다
애플 공식문서에 있는 article 에서는 다음과 같은 기준이 있는데,
Use structures by default.
Use classes when you need Objective-C interoperability.
Use classes when you need to control the identity of the data you're modeling.
Use structures along with protocols to adopt behavior by sharing implementations.
솔직히 피부에 와닿지는 않는다...
Self와 self 한 글자가 겨우 대문자, 소문자로 나뉘는데 이게 달라??
결론 : 다르게 쓰인다...
yun이 보내준 url인데 한번에 이해가 된 것 같다
간단하게 정리하자면
self = 타입 인스턴스에서 자기자신을 나타내는 프로퍼티
Self = 대문자 이기에, 타입 자체를 뜻함
여기서 메서드 someFunc()의 반환값을 Self 로 설정해주니 정보에 타입인 Fruit이 보이는걸 확인할 수 있다~