써니쿠키의 IOS 개발일기

[swift] components 에서 enum의 rawValue를 이용해 문자열 댕강 쪼개버리기⚔️ 본문

swift, Ios

[swift] components 에서 enum의 rawValue를 이용해 문자열 댕강 쪼개버리기⚔️

sunnyCookie 2022. 9. 22. 23:23

사실 이건 저의 삽질 기록입니다 😂

어쩌다가 삽질하게 되었는가..?

[1+2-3/4*5] 를 (+, -, /, *) 를 기준으로 쪼개고 싶었습니다.

근데 그저... 저 symbol들이 다름 enum타입의 rawValue 로 이미 있기 때문에 그 rawValue로 사용하고 싶었습니다 🤔!

💡 components(separatedBy:) 에 enum 열거형 rawValue 사용하는 방법

✅ 우선 components(separatedBy:)는 대괄호를 이용해서 쪼개기의 기준을 여러개로 설정해 줄 수 있다는 것을 알아야하고! 라잌디스

let a = "1#4%5^6"
print(a.components(separatedBy: ["#", "%", "^"]))
// ["1", "4", "6"]

✅ 그리고 enum타입에서 연산자 기호들을 rawValue로 가지고있고, allcases 사용하기 위해 caseIterable 프로토콜을 채택하고있습니다! 라잌디스

enum Operator: Character, CaseIterable {
    case add = "+"
    case subtract = "-"
    case divide = "/"
    case multiply = "*"
    }

그럼 이제
String인 1+2-3/4*5+, -, /, * 를 기준으로 쪼개서
[1, 2, 3, 4, 5]의 Double배열로 댕강 댕강 쪼개보자

 

1️⃣ 첫번째 방법 :

let input = "1+2-3/4*5"
input.components(separatedBy: ["+", "-", "/", "*"])

처음엔 아주 직관적인 방법으로 기호 그대로 넣어줬습니다

❗️❓하지만 찝찝해요 왜냐면 이미 Opertor열거형에 기호를 rawValue로 갖고있기 때문에 사용해야 할 것 같거든요

 

2️⃣ 두번째 방법 (오류와 삽질의 시간):

대괄호에 넣어주길래 단순히 배열로 넣어주는 줄 알았습니다.

 

allcases와 map을 이용해 rawVlaue를 배열로 만들어서 넣어줬습니다.

["+", "-", "/", "*"] 생긴건 똑같거든요 !?

let operators = Operator.allCases.map{ $0.rawValue }
input.components(separatedBy: operators)

❌ 오류

character배열 말고 characterSet을 달라네요

공식문서에  components(separatedBy:)에서는 `[CharacterSet] 타입을 받는다고 하네요 🤔

 

아 그럼 Set인가?

set으로 받는다는 줄 알고 Set()으로 형변환을 해줘봤습니다.

let operators = Set(Operator.allCases.map{ $0.rawValue })
input.components(separatedBy: operators)

❌ 오류

CharacterSet은 Character를 갖는 Set과는 다른친구였구나 ?

그럼 이제 CharacterSet을 파봐야지
이게 또 삽질의 ..묘미지..

 

3️⃣ 세번째 방법 :

✅ CharacterSet 타입으로 형변환 해주려면 CharacterSet(CharacterIn:)을 사용하면 되는구나 ! 

이때 CharatersIn으로는 String을 넣어줘야하므로 아까 map으로 꺼낸
["+", "-", "/", "*"] 이 배열에 joind()를 이용해 다시 문자열로 묶어줍니다!

let operators = CharacterSet(charactersIn: Operator.allCases.map{ String($0.rawValue) }.joined())
input.components(separatedBy: operators)

⭐️ 성공 ⭐️

반응형
Comments