import Foundation
func solution(_ s: String) -> String {
var arr = s.split(separator: " ")
arr.enumerated().map {
index, value in
arr[index] = value.first!.uppercased() + value.dropFirst().lowercased()
}
return arr.joined(separator: " ")
}
print(solution("3people unFollowed me"))
/Solution/Sources/Solution/Solution.swift:6:48: error: cannot assign value of type 'String' to subscript of type 'String.SubSequence' (aka 'Substring')
arr[index] = value.first!.uppercased() + value.dropFirst().lowercased()
var tmp = "3People"
print(type(of: tmp.dropFirst())) // Substring
굉장히 쿨한 공식문서
tmp.dropFirst()
이 친구가 문제인지 알았는데,
value.dropFirst().lowercased()
이 친구는 사실 더해지는 과정에서 lowercased()
를 하면 String
으로 return이 된다.
print(type(of: s.dropFirst().lowercased())) // String
Array<SubString>
타입이 되어버려서 이 안에 string타입을 넣을 수 없다는 경고문이었던 것 !print(type(of: s.split(separator: " "))) // Array<Substring>
func solution(_ s: String) -> String {
var arr = s.split(separator: " ").map { String($0) }
arr.enumerated().map {
index, value in
arr[index] = value.first!.uppercased() + value.dropFirst().lowercased()
}
return arr.joined(separator: " ")
}
split
해준거에 map으로 String이 될 수 있게끔 Array<String>
이 될 수 있게끔 수정을 해줬더니 문제없이 잘 돌아간다.
자 이제 맞는거 같은데 ?
질문계시판을 보니 저랑 동일하게 44.4%에서 머무른 사람들이 많았습니다. 좀 더 알아보니,
공백이 1개 이상일때에 대해서 나중에 separator: " "
로 joined
해주기 때문에 공백이 하나로 압축되니까 틀린것으로 간주되는 것이었다.
결론 : 공백은 그대로 유지될 수 있도록 코드를 작성해야한다.
func solution(_ s: String) -> String { let tmp = Array(s) var BlankBefore = true var answer = "" for item in tmp { answer += BlankBefore ? item.uppercased() : item.lowercased() BlankBefore = item == " " } return answer }
uppercased()
해주는 것이기 때문에 BlankBefore
로 판단해주면서 진행했다.uppercased()
, 그렇지않으면 lowercased()
해주는데, 숫자나 공백은 lowercased()
에 영향을 받지 않기 때문에 별도로 처리해줄 필요는없다. BlankBefore
이 true 그렇지 않으면 false가 됨으로 이를 조절해주면서 반복문을 돌리면 해결 시행착오를 겪으면서 특이한 메소드를 또 건질 수 있었다.