Mar 11, 2021, TIL (Today I Learned)

Inwoo Hwang·2021년 8월 26일
0
post-thumbnail

학습내용


한문장으로 설명할 수 없는 개념은 모르는 개념과 같다.

이런 저런 지식...

메소드, 프로퍼티

인스턴스: 일을 수행할 수 있는 실체 또는 형태

이 일을 하는 실체는 그 실체를 설명하는 것으로 부터 시작된다.인스턴스를 만들기 위해서는 이를 설명 해 줄 수 있는 코드가 필요하다. 필요한 것은 바로바로 타입[Type]!!

접근수준 access level

Open > public, internal, fileprivate, private

File private: private 이긴 하지만 같은 파일 안쪽에서 쓸 수 있게 된다.

private은 같은 파일 안쪽이더라도 class 밖에서는 수정이 불가능해진다.

internal은 프로젝트 안에서는 접근이 가능하다.

모듈

프로젝트 하나는 한 모듈단위로 이뤄진다.

""모듈(Module)은 배포할 코드의 묶음 단위입니다. 통상 하나의 프레임워크나 라이브러리 또는 애플리케이션이 모듈 단위가 될 수 있습니다. 스위프트에서는 import키워드를 사용해 불러옵니다." - 스위프트 프로그래밍 3판

textfield vs textview

한줄 입력을 위한 요소는 textfield, 여러줄은 textview

Accessibility

불투명도 감소, 화면읽기등 사용사의 접근성을 향상하기 위해 살펴보아야 할 내용은:

Accessibility

Struct vs Class: Type

읽어도 읽어도 헷갈리는 것이 바로 값 타입참조 타입.

값 타입

  • 함수의 전달인자로 값 타입의 값을 넘긴다면 전달될 값이 복사되어 전달된다.

참조 (주소)

  • 참조 타입이 전달인자로 전달될 때는 값을 복사하지 않고 참조(주소가) 전달 된다.

Struct vs Class: Initializer

  • 구조체와 클래스의 인스턴스는 처음 생성할 때 옵셔널 저장 프로퍼티 제외 모든 저장 프로퍼티에 적절한 초깃값을 할당해야 한다.

이니셜라이저 타입:

기본 이니셜라이저:

  • 클래스나 구조체는 모든 프로퍼티에 기본값이 지정 되어 있다는 가정 하에 기본 이니셜라이저를 사용한다.
  • 기본 이니셜라이저는 저장 프로퍼티의 기본값이 모두 지정되어 있고, 동시에 사용자 정의 이니셜라이저가 정의되어 있지 않은 상태에서 제공됩니다.

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 디자인 패턴을 따라서 천천히 다시 구현 해 보려고 합니다. 잠을 줄여야겠어요...ㅜㅠ

profile
james, the enthusiastic developer

0개의 댓글