모델을 만들어 보자.
TypeAlias TimeInterval
: ‘초' 를 나타내는 Double 타입 수의 타입 앨리어스이다.
타입 앨리어스는 특정 타입에 대해 일종의 별명을 달아주는 것인데 TimeInterval 은 Double 타입이고 여기서는 시간차이라는 점을 나타내기 위해 사용되었다.
Instance Property timeIntervalSinceNow
: 현재 시간과의 시간차이를 리턴하며 현재보다 앞선 시간이라면 값은 음수가 된다.
이전 챕터에서 배운 MVC 디자인패턴을 적용하여 어플케이션을 제작해보자.
우선 모델,뷰,컨트롤러를 명확히 구분하기 위해 그룹으로 나누어 보자.
프로젝트 네비게이터에서 오른쪽 버튼을 클릭하면 새로운 그룹을 만드는 메뉴가 있다.

MVC 중 무엇을 먼저 만드는것이 좋을까? 눈에 보이는 뷰를 먼저 만드는 것이 전체적인 설계를 하는데 도움이 될 것이다.

위와 같은 뷰를 먼저 만들자. 레이블과 버튼을 이용하면 어렵지 않을것이다.
이 프로젝트에서 모델은 무엇인가? 모델을 만들때 필요한 사항은 무엇인지 생각해보자.
MVC 디자인패턴에서 예로 든 자동차와 고양이의 모델을 떠올려보자.
모델을 설계하기 위해 속성과 행위로 구분하여 정의해 보았다.
스톱워치 모델의 속성과 행위는 무엇일까?
start버튼을 누르면 0.0초부터 시작해서 시간이 흐르고 stop버튼을 누르면 시간이 멈춘다.
그러므로 아래와 같이 정리해 볼 수 있을것이다.
속성은 프로퍼티로, 행위는 메서드로 표현하면 되는것이다.
Date 스트럭처에 대한 레퍼런스를 체크해서 위에서 설계한 모델을 코드로 표현해 보자.
먼저 StopWatch.swift 파일을 생성하여 다음과 같이 클래스를 만들자.
class Stopwatch {
private var startTime: Date?
먼저 시작시간을 프로퍼티로 만들어 보자.
시작시간은 단순한 숫자가 아닌 ‘시간’이기 때문에 시간에 관련된 타입으로 선언해야 한다.
시작시간은 계속 변하며 클래스 내부에서만 사용되므로 private var로 선언하였다. 그렇다면 왜 Date 옵셔널 타입으로 선언한 것일까? 물론 처음에 값을 대입해도 되지만 변수에 값을 할당한다는 것은 그만큼 메모리의 공간을 차지한다는 의미이다.
시작시간은 start버튼을 누를때 실제로 필요한 것이지 앱을 실행할때 필요한것이 아니므로 최대한 메모리를 적게 사용하기 위해 옵셔널로 선언만 했다. 옵셔널이 아닌 Date로 선언하면 반드시 초기화 작업을 해줘야 하기 때문이다. 이렇게 앱이 실행되는 시점에 반드시 필요하지 않은 프로퍼티는 옵셔널로 선언해두고 필요할때 값을 할당하는것이 메모리 측면에서 효율적이다.
경과한 시간을 나타내기 위한 연산 프로퍼티를 선언한다.
var elapsedTime: TimeInterval {
if let startTime = self.startTime {
return -startTime.timeIntervalSinceNow
} else {
return 0
}
}
startTime 프로퍼티를 제어하기 위한 메서드를 추가한다.
func start() {
startTime = Date()
}
func stop() {
startTime = nil
}
간단한 모델과 뷰를 만들어 보았지만 앱을 실행해도 동작하지 않는다.
이제 모델과 뷰가 연동될 수 있도록 컨트롤러에서 구현해 줄 차례이다.