protocol로 선언된 메서드는 파라미터 기본값을 가질 수 없다
extension을 이용해 기본 메서드를 구현
protocol defalutMethodProtocol {}
extension defalutMethodProtocol {
func defalutMethod(_ element: String) {
print("\(element)")
}
}
class implement: defalutMethodProtocol {}
let implementClass: implement = implement()
implementClass.defalutMethod("Inputelement")
//Inputelement
associatedtype을 사용하는 prameter에 기본값을 주기위해서는 제약을 줘야함
associatedtype 자체에 제약을 주면 protocol에서 사용하는 typeparameter전체에 제약을 줄 수 밖에 없음
defaultMthod를 위해 protocol을 채택하는 타입의 typeparameter를 한정지음
protocol defalutMethodProtocol {
associatedtype T: BinaryInteger
}
extension defalutMethodProtocol {
func defalutMethod(_ element: T = 3) {
print("\(element)")
}
}
class implement: defalutMethodProtocol {
typealias T = Int
}
let implementClass: implement = implement()
implementClass.defalutMethod()
implementClass.defalutMethod(4)
//3
//4
protocol에서 associatedtype과 별개로 제약을 주고 싶을땐 where키워드를 사용
defaultMethod에서 사용하는 타입과 별개로 다른 제네릭타입을 사용하는 것이 가능
하지만 defaultMethod를 사용하지 못함
defaultMethod를 사용하기 위해서 protocol을 채택하는 타입의 typeparameter를 한정 짓는 것은 같음
ex. protocol을 implement하는 타입이 BinaryInteger를 채택했을때만 defaultMethod 사용 가능
protocol defalutMethodProtocol {
associatedtype T
}
extension defalutMethodProtocol where T: BinaryInteger{
func defalutMethod(_ element: T = 3) {
print("\(element)")
}
}
class implement: defalutMethodProtocol {
typealias T = Double
}
let implementClass: implement = implement()
implementClass.defalutMethod()//error
implementClass.defalutMethod(4)//error
defaultMethod에서 사용하는 타입과 별개로 다른 제네릭타입을 사용하면서 defalutMethod또한 사용하기 위해서는 genericMethod를 사용하면 됨
protocol defalutMethodProtocol {
associatedtype T
}
extension defalutMethodProtocol {
func defalutMethod<V>(_ element: V = 3) {
print("\(element)")
}
}
class implement: defalutMethodProtocol {
typealias T = Double
}
let implementClass: implement = implement()
implementClass.defalutMethod() //3
implementClass.defalutMethod(4) //4
genericMethod의 typeParameter에 제약을 줬을때 associatedtype이 그 제약과 별개면 defalutValue사용 불가능
protocol defalutMethodProtocol {
associatedtype T
}
extension defalutMethodProtocol {
func defalutMethod<V: BinaryInteger>(_ element: V = 3) {
print("\(element)")
}
}
class implement: defalutMethodProtocol {
typealias T = Double
}
let implementClass: implement = implement()
implementClass.defalutMethod() //error
implementClass.defalutMethod(4) //4
참고링크
https://zeddios.tistory.com/1365
저장공간을 갖고있지 않다
항상 var로 선언함
어떤 값을 저장하고 있지 않기 때문에 타입 추론이 불가능
반드시 선언할때 타입 어노테이션을 통해 자료형을 명시함
다른 저장 연산프로퍼티의 값을 얻거나 연산하여 리턴할 때 사용
return 구문이 항상 존재
get-only로 선언 가능
다른 저장프로퍼티에 값을 저장할 때 사용
연산프로퍼티를 선언할 때 타입을 반드시 선언
set-only 선언 불가능
set parameter는 생략 가능
set parameter는 하나만 존재
newValue 키워드를 통해 set parameter 생략가능
set {
self.name = newValue
}
저장프로퍼티, 연산프로퍼티 정의
프로토콜에서 정의해준 프로퍼티를 채택하는 곳에서 저장,연산 프로퍼티 상관없이 구현 가능
저장프로퍼티의 경우 { get set } 속성에 따라 let/var 가 달라짐
연산프로퍼티의 경우는 항상 var 선언
protocol에서 선언되는 프로퍼티는 항상 var로 선언해야함
연산 프로퍼티가 항상 var로 선언돼야 하기 때문
@objc를 붙여서 선언해주면 채택하는 곳에서 선언해주지 않아도 에러가 나지 않는다
@objc protocol ProtocolTest {
var value: String { get set }
@objc optional var optionalValue: String { get set }
}
https://babbab2.tistory.com/18
참조 타입
heap에 할당됨
변수나 상수에는 해당 인스턴스의 참조(포인터)가 저장
값 타입
메모리에 직접 저장
변수 또는 상수에 직접 값을 복사하여 저장
구조체 인스턴스
https://velog.io/@falling_star3/GitHub-git-add-git-commit-git-push-취소변경덮어쓰기
빈 튜플을 반환