한문장으로 설명할 수 없는 개념은 모르는 개념과 같다.
인스턴스: 일을 수행할 수 있는 실체 또는 형태
이 일을 하는 실체는 그 실체를 설명하는 것으로 부터 시작된다.인스턴스를 만들기 위해서는 이를 설명 해 줄 수 있는 코드가 필요하다. 필요한 것은 바로바로 타입[Type]
!!
Open > public, internal, fileprivate, private
File private: private 이긴 하지만 같은 파일 안쪽에서 쓸 수 있게 된다.
private은 같은 파일 안쪽이더라도 class 밖에서는 수정이 불가능해진다.
internal은 프로젝트
안에서는 접근이 가능하다.
프로젝트 하나는 한 모듈단위로 이뤄진다.
""모듈(Module)은 배포할 코드의 묶음 단위입니다. 통상 하나의 프레임워크나 라이브러리 또는 애플리케이션이 모듈 단위가 될 수 있습니다. 스위프트에서는 import키워드를 사용해 불러옵니다." - 스위프트 프로그래밍 3판
textfield vs textview
한줄 입력을 위한 요소는 textfield, 여러줄은 textview
Accessibility
불투명도 감소, 화면읽기등 사용사의 접근성을 향상하기 위해 살펴보아야 할 내용은:
Accessibility
읽어도 읽어도 헷갈리는 것이 바로 값 타입
과 참조 타입
.
값 타입
복사
되어 전달된다.참조 (주소)
참조(주소가) 전달 된다.
이니셜라이저 타입:
기본 이니셜라이저
:
ex) var number: Int = 5
사용자 정의 이니셜라이저
(init) {
메소드와 같은 문법
}
멤버와이즈 이니셜라이저
구조체는 사용자 정의 이니셜라이저를 구현하지 않으면 프로퍼티의 이름으로 매개변수를 갖는 이니셜라이저 멤버와이즈 이니셜라이저를 기본으로 제공합니다 (init 없으면 자동으로 적용)
*클래스는 해당 기능을 지원하지 않는다. 구조체의 특권!!
struct Fruit {
private(set) var quantity: Int = 10
mutating func useStock(amount: Int) {
quantity -= amount
}
mutating func addStock() {
quantity += 1
}
mutating func subtractStock() {
quantity -= 1
}
}
enum FruitType {
static var strawberry: Fruit = Fruit()
static var banana: Fruit = Fruit()
static var kiwi: Fruit = Fruit()
static var pineapple: Fruit = Fruit()
static var mango: Fruit = Fruit()
struct JuiceMaker {
func makeJuice(juice: JuiceRecipe.Recipe) throws {
switch juice {
case JuiceRecipe.strawberryJuiceRecipe:
if FruitType.strawberry.quantity >= JuiceRecipe.strawberryJuiceRecipe[0].requiredQuantity {
FruitType.strawberry.useStock(amount: JuiceRecipe.strawberryJuiceRecipe[0].requiredQuantity)
}
default: ()
}
}
struct JuiceRecipe {
typealias Recipe = [ingredient]
static let strawberryJuiceRecipe: Recipe = [ingredient("딸기", 16)]
static let bananaJuiceRecipe: Recipe = [ingredient("바나나", 2)]
static let kiwiJuiceRecipe: Recipe = [ingredient("키위", 3)]
static let pineappleJuiceRecipe: Recipe = [ingredient("파인애플", 2)]
static let strawberryBananaJuiceRecipe: Recipe = [ingredient("딸기", 10), ingredient("바나나", 1) ]
static let mangoJuiceRecipe: Recipe = [ingredient("망고", 3)]
static let mangoKiwiJuiceRecipe: Recipe = [ingredient("망고", 2), ingredient("키위", 1)]
}
static var
을 활용하여 과일 객체를 구현 했습니다. 이렇게 하면 따로 인스턴스로 만들지 않고 enum을 활용하여 바로 다이렉트하게 타입에 접근하고 사용할 수 있기 때문에 유용할 것이라 생각했습니다. 그리고 비슷한 논리로 쥬스 레시피 또한 static 프로퍼티로 구현을 하였고 배열을 활용하여 레시피의 데이터 값을 처리하려 했습니다.
이렇게 타입을 구현한 뒤 switch문을 활용해서 과일과 쥬스 레시피의 프로퍼티 값을 비교해서 쥬스레시피에 맞는 쥬스를 return받으려고 코드를 구성 해 보았습니다.
그런데 다 짜고 보니까 일단 코드 가독성이 매우 떨어지고 객체 또한 부실하게 설계되어서 유지보수 측면에서 엄청 안좋은 평가를 받았습니다.
따라서 다시 한 번 더 코드를 갈아엎고 다시 한 번 짜보려고 합니다.
동료 캠퍼의 조언을 따라 singleton을 활용하여 MVC 디자인 패턴을 따라서 천천히 다시 구현 해 보려고 합니다.
따라서 다시 한 번 더 코드를 갈아엎고 다시 한 번 짜보려고 합니다.
동료 캠퍼의 조언을 따라 singleton을 활용하여 MVC 디자인 패턴을 따라서 천천히 다시 구현 해 보려고 합니다. 잠을 줄여야겠어요...ㅜㅠ