반응형
Swift에서 UIColor를 초기화할 때, 다양한 16진수 형식의 문자열(0x~~, #~~~, FFFFFF)을 지원하는 유틸리티 확장을 구현해보겠습니다. 또한, 이를 검증하기 위한 테스트 코드도 작성합니다.
import UIKit
extension UIColor {
convenience init?(hex: String) {
var hexSanitized = hex.trimmingCharacters(in: .whitespacesAndNewlines)
hexSanitized = hexSanitized.replacingOccurrences(of: "0x", with: "").replacingOccurrences(of: "#", with: "")
var rgb: UInt64 = 0
guard Scanner(string: hexSanitized).scanHexInt64(&rgb) else { return nil }
let length = hexSanitized.count
switch length {
case 6: // RGB (FFFFFF)
self.init(
red: CGFloat((rgb >> 16) & 0xFF) / 255.0,
green: CGFloat((rgb >> 8) & 0xFF) / 255.0,
blue: CGFloat(rgb & 0xFF) / 255.0,
alpha: 1.0
)
case 8: // ARGB (FFFFFFFF)
self.init(
red: CGFloat((rgb >> 16) & 0xFF) / 255.0,
green: CGFloat((rgb >> 8) & 0xFF) / 255.0,
blue: CGFloat(rgb & 0xFF) / 255.0,
alpha: CGFloat((rgb >> 24) & 0xFF) / 255.0
)
default:
return nil
}
}
}
테스트 코드
이제, XCTest 프레임워크를 사용하여 위의 확장 기능이 정상적으로 작동하는지 확인하는 테스트 코드를 작성합니다.
import XCTest
@testable import YourProject // 프로젝트 명에 맞게 변경하세요.
class UIColorHexTests: XCTestCase {
func testHexColorInitialization() {
let color1 = UIColor(hex: "0xFF5733")
let color2 = UIColor(hex: "#FF5733")
let color3 = UIColor(hex: "FF5733")
let color4 = UIColor(hex: "#80FF5733")
let color5 = UIColor(hex: "80FF5733")
let invalidColor = UIColor(hex: "XYZ123")
XCTAssertNotNil(color1, "0xFF5733 should be valid")
XCTAssertNotNil(color2, "#FF5733 should be valid")
XCTAssertNotNil(color3, "FF5733 should be valid")
XCTAssertNotNil(color4, "#80FF5733 should be valid")
XCTAssertNotNil(color5, "80FF5733 should be valid")
XCTAssertNil(invalidColor, "XYZ123 should be invalid")
}
}
이제 UIColor를 다양한 16진수 형식의 문자열을 사용하여 쉽게 초기화할 수 있습니다.
- 0xRRGGBB, #RRGGBB, RRGGBB → RGB 값으로 해석
- #AARRGGBB, AARRGGBB → ARGB 값으로 해석
- 올바르지 않은 형식이면 nil 반환
반응형
'클라이언트' 카테고리의 다른 글
[iOS] SnapKit을 활용한 iOS UI 레이아웃 잡기 (0) | 2025.02.17 |
---|---|
[iOS] Jailbreak (탈옥) 상태에서 Keychain 데이터 가져오기 (0) | 2025.02.16 |
[GameKit] 간단한 가위바위보 멀티게임 만들기 (0) | 2025.02.16 |
[iOS] iOS 앱 리버싱 간단한 예제 (0) | 2025.02.16 |
[Combine] Combine의 기본 개념 및 예제 (0) | 2025.02.16 |