명언 생성 버튼을 누를 때마다 명언과 함께 그 명언을 말한 인물의 이름이 랜덤하게 화면에 표시되는 앱이다. 이 프로젝트는 StoryBoard, AutoLayout을 이용하여 UI를 구성하였고, 명언과 인물 이름을 표시할 UILabel과 랜덤한 명언과 이름을 생성해 주는 UIButton을 이용하였다.
그리고!
UI가 붙는 클래스를 사용하려면 UIKit를 import 해야 한다는 것!! 잊지 말기!
M : Model, V: View, C: Controller
Model은 앱의 데이터와 비지니스 로직을 가지고 있고, View는 사용자에게 데이터를 보여 주는 UI를 담당하며, Controller는 View와 Model의 중간 다리 역할을 한다. View로부터 사용자 액션을 전달받아서 Model에게 어떤 작업을 해야 하는지 알려 주거나, Model의 데이터 변화를 View에게 전달하여 View를 어떻게 업데이트해야 할지 알려 주는 것이다!
어렵다....^^
하지만... 현실 MVC는
View와 Controller가 강하게 연결되어 있기에 View Controller가 거의 모든 일을 담당하게 되어 View와 Contoller를 분리하기 어렵다. 그래서 프로젝트 규모가 커질수록 Controller가 비대해지고 내부 구조가 복잡하게 되어 유지보수가 힘들다...... 그래서! 이것을 해결하기 위해 MVVM, 바이버 패턴 등 다양한 디자인 패턴을 통해 문제점을 해결할 수 있다는 말씀..

(1) 데이터 변화에 따라서 View 컨텐츠를 업데이트
(2) 뷰들과 함께 사용자 상호작용에 응답
(3) 뷰를 리사이징하고, 전체적인 인터페이스의 레이아웃 관리
(4) 다른 뷰 컨트롤러들과 함께 앱을 구성
![]() | ![]() | ![]() |
Quote.swift
import Foundation
struct Quote {
let content: String
let name: String
}
ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var quoteLabel: UILabel!
@IBOutlet weak var nameLabel: UILabel!
let quotes = [
Quote(content: "죽음을 두려워하는 나머지 삶을 시작조차 못하는 사람이 많다.", name: "벤다이크"),
Quote(content: "나는 나 자신을 빼 놓고는 모무 안다.", name: "비용"),
Quote(content: "편견이란 실효성이 없는 의견이다.", name: "암브로스 빌"),
Quote(content: "분노는 바보들의 가슴 속에서만 살아간다.", name: "아인슈타인"),
Quote(content: "몇 번이라도 좋다! 이 끔찍한 생이여... 다시!", name: "니체")
]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func tap(_ sender: Any) {
let random = Int(arc4random_uniform(5)) // 0~4 사이의 난수를 랜덤하게 만들어줌. 배열의 인덱스에 접근해야 하기 때문에 Int 형으로 변환시켜줌.
let quote = quotes[random]
quoteLabel.text = quote.content
nameLabel.text = quote.name
}
}