개발을 하다보면 특정한 단위를 표현할 일이 생기는데 그 때마다 파일의 단위를 계산하는 것은 비효율적이고, 단위를 표현하는 명확한 것이 있으면 좋다고 생각했다. 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 |