TIL30 ✨

YaR Lab·2023년 6월 2일
0

TIL✨

목록 보기
20/135
post-thumbnail

23.06.02

Protocol

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로 선언함
어떤 값을 저장하고 있지 않기 때문에 타입 추론이 불가능
반드시 선언할때 타입 어노테이션을 통해 자료형을 명시함

get (getter)

다른 저장 연산프로퍼티의 값을 얻거나 연산하여 리턴할 때 사용
return 구문이 항상 존재
get-only로 선언 가능

set (setter)

다른 저장프로퍼티에 값을 저장할 때 사용
연산프로퍼티를 선언할 때 타입을 반드시 선언
set-only 선언 불가능
set parameter는 생략 가능
set parameter는 하나만 존재
newValue 키워드를 통해 set parameter 생략가능

set {
	self.name = newValue
}

Protocol

저장프로퍼티, 연산프로퍼티 정의
프로토콜에서 정의해준 프로퍼티를 채택하는 곳에서 저장,연산 프로퍼티 상관없이 구현 가능
저장프로퍼티의 경우 { get set } 속성에 따라 let/var 가 달라짐
연산프로퍼티의 경우는 항상 var 선언

var

protocol에서 선언되는 프로퍼티는 항상 var로 선언해야함
연산 프로퍼티가 항상 var로 선언돼야 하기 때문

{ get }
  • 연산프로퍼티
    getter(get-only) / getter & setter 선언 모두 가능
  • 저장프로퍼티
    let/var 모두 선언 가능
{ get set }
  • 연산프로퍼티
    getter & setter 모두 구현해줘야함
  • 저장프로퍼티
    var 로만 선언 가능, let 선언 불가능
프로퍼티 optional setting

@objc를 붙여서 선언해주면 채택하는 곳에서 선언해주지 않아도 에러가 나지 않는다

@objc protocol ProtocolTest {
	var value: String { get set }
    @objc optional var optionalValue: String { get set }
}

Array

https://babbab2.tistory.com/18

class vs struct

class

참조 타입
heap에 할당됨
변수나 상수에는 해당 인스턴스의 참조(포인터)가 저장

struct

값 타입
메모리에 직접 저장
변수 또는 상수에 직접 값을 복사하여 저장
구조체 인스턴스

push 취소

https://velog.io/@falling_star3/GitHub-git-add-git-commit-git-push-취소변경덮어쓰기

Void

빈 튜플을 반환

0개의 댓글