MINRYUL
류링류링
MINRYUL
전체 방문자
오늘
어제
  • 분류 전체보기
    • Swift
      • 학습
    • iOS
      • Toy-Project
      • 학습
      • Metal
    • CS
    • TIL

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • TDD
  • TableView Cell
  • RxSwift
  • Existential any
  • some
  • BDD
  • static framework
  • Any
  • Existential type
  • Swift
  • urlsession
  • opaque type
  • CollectionView Cell
  • RxTest
  • Protocol
  • tuist
  • WWDC 2024
  • Clean Architecture
  • ios
  • dynamic frameworkm
  • Custom Calendar
  • demangle
  • collectionView
  • configuration_bulid_dir
  • METAL
  • ViewStore
  • WWDC
  • RxNimble
  • AttributeText
  • RxCocoa

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
MINRYUL

류링류링

Swift/학습

enum으로 특정 단위를 명확하게 표현하기

2022. 9. 25. 15:42

개발을 하다보면 특정한 단위를 표현할 일이 생기는데 그 때마다 파일의 단위를 계산하는 것은 비효율적이고, 단위를 표현하는 명확한 것이 있으면 좋다고 생각했다. Enum으로 원하는 사이즈들을 정의하고, Comparable protocol로 단위들의 비교가 가능하도록 작성했다. 특정 사이즈에서 fitSize를 하면 현재 사이즈에서 범위의 맞는 사이즈를 재귀를 통해 return 하도록 작성했다.

import Foundation

enum FileSize: Comparable {
  case byte(Float)
  case kilobyte(Float)
  case megabyte(Float)
  
  var toByte: FileSize {
    switch self {
      case .byte(_): return self
      case .kilobyte(let size): return FileSize.byte(size * 1000)
      case .megabyte(let size): return FileSize.byte(size * 1000 * 1000)
    }
  }
  
  var toKiloByte: FileSize {
    switch self {
      case .byte(let size): return FileSize.kilobyte(size/1000)
      case .kilobyte(_): return self
      case .megabyte(let size): return FileSize.kilobyte(size * 1000)
    }
  }
  
  var toMegaByte: FileSize {
    switch self {
      case .byte(let size): return FileSize.megabyte(size/(1000 * 1000))
      case .kilobyte(let size): return FileSize.megabyte(size/1000)
      case .megabyte(_): return self
    }
  }
  
  var fitSize: FileSize {
    switch self {
      case .byte(let size):
        switch size {
          case let size where size >= 1000:
            return self.toKiloByte.fitSize
          default: return self
        }
        
      case .kilobyte(let size):
        switch size {
          case let size where size >= 1000:
            return self.toMegaByte.fitSize
          case let size where size < 1:
            return self.toByte.fitSize
          default: return self
        }
        
      case .megabyte(let size):
        switch size {
          case let size where size >= 1000: return self
          case let size where size < 1:
            return self.toKiloByte.fitSize
          default: return self
        }
    }
  }
  
  private var toUnit: Float {
    switch self {
      case .byte(let size): return size
      case .kilobyte(let size): return size * 1000
      case .megabyte(let size): return size * 1000 * 1000
    }
  }
  
  static func == (lhs: FileSize, rhs: FileSize) -> Bool {
    return lhs.toUnit == rhs.toUnit
  }
  
  static func < (lhs: FileSize, rhs: FileSize) -> Bool {
    return lhs.toUnit < rhs.toUnit
  }
}

 

'Swift > 학습' 카테고리의 다른 글

Existential any in Swift explained with code examples(번역)  (0) 2023.04.06
Swift Opaque Types(번역)  (0) 2023.03.28
2022 WWDC Embrace Swift Generics  (1) 2022.07.04
Swift Subscripts  (0) 2022.05.23
Protocol Optional Function  (0) 2022.04.14
    'Swift/학습' 카테고리의 다른 글
    • Existential any in Swift explained with code examples(번역)
    • Swift Opaque Types(번역)
    • 2022 WWDC Embrace Swift Generics
    • Swift Subscripts
    MINRYUL
    MINRYUL
    열심히 살자

    티스토리툴바