명언 생성 버튼을 누를 때마다 명언과 함께 그 명언을 말한 인물의 이름이 랜덤하게 화면에 표시되는 앱이다. 이 프로젝트는 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
}
}