dev-signer
개자이너
dev-signer
전체 방문자
오늘
어제
  • 분류 전체보기 (20)
    • Project (8)
      • DIMODAMO (1)
      • Menual (6)
      • WatchOS (1)
    • iOS (9)
      • Swift (6)
      • UI (2)
    • 코딩테스트 (2)
    • 일상 (1)
      • 이야기 (1)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • 사이드프로젝트
  • tuist
  • Dependency Injection
  • 메뉴얼
  • 파이썬 알고리즘 인터뷰
  • watchos
  • SnapKit
  • 리뷰요청하기
  • 디지털미디어디자인
  • 알고리즘
  • ios
  • 코딩테스트
  • 주니어개발자
  • 스위프트
  • Swift
  • 의존성주입
  • menual
  • XCode
  • 파이썬
  • swfit

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dev-signer

개자이너

[Swift] 프로퍼티(Property)
iOS/Swift

[Swift] 프로퍼티(Property)

2022. 12. 26. 14:30

프로퍼티

접근자 메소드를 자동으로 생성하는 기술입니다.

let으로 생성했을 경우에는 getter 기능만 제공하는 것이고,
var로 생성했을 경우에는 getter, (optional) setter 두 가지 기능을 모두 제공하는 것입니다.

  • Stored Property - 저장형 프로퍼티
    • 단순히 값을 저장하고 있는 프로퍼티
    • Enum 에서 사용 불가능
  • Computed Property - 계산형 프로퍼티
    • var를 사용합니다.
    • newValue로 setter에서 새로운 값을 사용할 수 있습니다. (변수명 지정도 가능합니다)
    • 프로퍼티를 가장한 메소드입니다
    • 간단한 메소드를 계산형 프로퍼티로 사용하면, 코드의 가독성에 도움이 됩니다.

메소드로 기능을 제공할 경우

struct Timer {
	let id: Int
    let startTime: Date
    var endTime: Date?
    
    func elapsedTime() -> TimeInterval {
    	return Date().timeIntervalSince(startTime)
    }
    
    func isFinished() -> Bool {
    	return endTime != nil
    }
    
    // mutating이 없으면 오류 발생!!
    // mutating 문구를 func 앞에 추가 해주어야 합니다.
    mutating func setFinished() {
    	endTime = Date()
    }
    
    // 원하는 형태로 객체 초기화를 위해서는 별도의 초기화 메소드를 제공해야 합니다.
    // -> 구조체가 자동으로 제공하는 초기화 메소드는 사용 불가능합니다.
    init(id: Int, startTime: Date) {
    	self.id = id
        self.startTime = startTime
    }
}

var timer = Timer(id: 1, startTime: Date())
print(timer.elapsedTime())
sleep(2)
print(timer.elapsedTime())
timer.setFinished()
print(timer.isFinished())

mutating

내부의 속성을 변경하는 메소드는 반드시 mutating 으로 지정되어야 합니다.

  1. 가변객체

var timer = Timer() 는 가변 객체이기 때문에, mutating method를 호출할 수 있습니다.

  1. 불변객체

let timer = Timer() 는 불변 객체이기 때문에, 내부의 속성을 변겨할 수 없습니다. 즉, mutating method를 호출할 수 없습니다.


Computed Property로 기능을 제공할 경우

struct Timer {
	let id: Int
    let startTime: Date
    var endTime: Date?
    
    // Computed Property는 var를 사용해야 합니다.
    // Getter만 제공할 경우에는 get을 생략해도 됩니다.
    var elapsedTime: TimeInterval {
    	get {
        	return Date().timeIntervalSince(startTime)
        }
    }
    
    var isFinished: Bool {
    	get {
        	return endTime != nil
        }
        
        set {
        	// newValue: 사용자가 전달한 값
            if newValue {
            	endTime = Date()
            } else {
            	endTiem = nil
            }
        }
    }
    
    init(id: Int, startTime: Date) {
    	self.id = id
        self.startTime = startTime
    }
}

var timer = Timer(id: 1, startTime: Date())
print(timer.elapsedTime)
sleep(2)
print(timer.elapsedTime)

timer.isFinished = true // 구조체의 경우에는 var에서만 수행 가능
print(tiemr.isFinished)
반응형

'iOS > Swift' 카테고리의 다른 글

[Swift] Enum2  (0) 2022.12.26
[Swift] 상속  (0) 2022.12.26
[Swift] Tuple  (0) 2022.12.26
[Swift] Enum  (0) 2022.12.26
[Swift] 문자열 (String)  (0) 2022.12.26
    'iOS/Swift' 카테고리의 다른 글
    • [Swift] Enum2
    • [Swift] 상속
    • [Swift] Tuple
    • [Swift] Enum
    dev-signer
    dev-signer

    티스토리툴바