본문 바로가기

프로그래밍/SWIFT

[Swift] error: ambiguous use of 'split(separator:maxSplits:omittingEmptySubsequences:)'

반응형

너무 간단한 코드를 짜는데, 너무 이상한 에러가 발생했다.

코드가 풀려고 하는 문제는 문자열을 단어별로 분리해서, 가장 짧은 단어의 길이를 찾는 것이다. 빈칸이 포함된 어느정도 길이의 문자열이 인자로 주어지고, 빈칸으로 단어가 나누어진다.

푸는 알고리즘은 간단하다

  • 주어진 문자열을 빈칸으로 나누어 ( spllit 메소드 ) 단어의 시퀀스로 만든다
  • 시퀀스의 각 단어의 길이를 .count 로 구한다. 이를 매핑해서 단어길이의 시퀀스로 변환한다.
  • 단어길이의 시퀀스에서 가장 작은 것을 .min() 으로 구한다.

코드를 보면 한줄로 끝이 난다. (아래 코드는 가독성을 위해 줄바꿈을 추가.)

func find_short(_ str: String) -> Int 
{
  return str.split(separator: " ")// 문자열을 빈칸으로 나누어 단어의 시퀀스를 만든다.
            .map { $0.count }     // 각 단어의 길이를 구하여, 단어길이의 시퀀스로 변환됨.
            .min()!               // 그중에서 최소값을 구한다.
}

이렇게 짰는데, 에러가 발생했다. ( swiftc --version == 5.0.1 )

main.swift:3:9: error: ambiguous use of 'split(separator:maxSplits:omittingEmptySubsequences:)'
        return str.split(separator: " ")  // 문자열을 빈칸으로 나누어 단어의 시퀀스를 만든다.
Swift.Sequence:2:40: note: found this candidate
    @inlinable public __consuming func split(separator: Self.Element, maxSplits: Int = Int.max, omittingEmptySubsequences: Bool = true) -> [ArraySlice<Self.Element>]
                                       ^
Swift.Collection:2:40: note: found this candidate
    @inlinable public __consuming func split(separator: Self.Element, maxSplits: Int = Int.max, omittingEmptySubsequences: Bool = true) -> [Self.SubSequence]
                                       ^

아무리 들어다 봐도 이해할 수가 없었다.

에러메시지를 잘 해석해 보면, ambiguous use of split 는, str.split 으로 사용한 저 split 메소드를 Swift.Sequence 에 정의되어 있는 split 과,Swift.Collection 에 정의되어 있는 split (인자의 타입도 완전히 동일하고, 리턴타입만 차이가 있음) 두 개 중에서 어느 걸 실행해야 할지 모르겠다는 말이다. ( 링크 등을 검색해서 읽어보고 겨우 이해함. )

코드를 조금 단계를 나누어 실행되도록 바꾸어 봤다.

func find_short(_ str: String) -> Int 
{
  let words = str.split(separator: " ")  // 문자열을 빈칸으로 나누어 단어의 시퀀스를 만든다.
  return    words.map { $0.count }       // 각 단어의 길이를 구하여, 단어길이의 시퀀스로 변환됨.
                 .min()!                 // 그중에서 최소값을 구한다.
}

이렇게 단계를 나누니 에러가 발생하지 않고 잘 동작했다. 여전히 이해할 수 없었다.

여전히 왜 그런지 이해가 안 가지만, 혹시 검색으로 이 포스팅을 보실 분들을 위해서, 이 문제의 해결책을 써 본다면, split 대신에 components 로 문자열 나누기를 하면 문제가 없는 것 같다. 스택오버플로우에서도 그런 조언들이 있고, codewars 의 위쪽 솔루션들도 components 를 쓴 것이 많이 보였다.

728x90

'프로그래밍 > SWIFT' 카테고리의 다른 글

100DaysOfSwiftUI  (0) 2022.07.01
100DaysOfSwiftUI - Day 16  (0) 2022.07.01
[Swift] Counter 구현하기 via codewars  (0) 2022.06.22
[Swift] 소인수분해  (0) 2022.06.20
[Swift] swift 단일 스크립트 파일을 컴파일하기  (0) 2022.06.16