스위프트 문자열을 배열로 변환


133

Swift에서 문자열 "Hello"를 배열 [ "H", "e", "l", "l", "o"]로 변환하려면 어떻게해야합니까?

Objective-C에서 나는 이것을 사용했다 :

NSMutableArray *characters = [[NSMutableArray alloc] initWithCapacity:[myString length]];
for (int i=0; i < [myString length]; i++) {
    NSString *ichar  = [NSString stringWithFormat:@"%c", [myString characterAtIndex:i]];
    [characters addObject:ichar];
}

답변:


338

스위프트에서는 더 쉽습니다.

let string : String = "Hello 🐶🐮 🇩🇪"
let characters = Array(string)
println(characters)
// [H, e, l, l, o,  , 🐶, 🐮,  , 🇩🇪]

이것은 사실을 사용합니다

  • ArrayA로부터 생성 될 수있다 SequenceType, 및
  • StringSequenceType프로토콜을 따르고 시퀀스 생성기는 문자를 열거합니다.

Swift 문자열은 유니 코드를 완벽하게 지원하므로 "Basic Multilingual Plane"(예 : 🐶) 외부의 문자 및 확장 된 grapheme 클러스터 (예 : 실제로 두 개의 유니 코드 스칼라 로 구성된 🇩🇪) 와도 작동 합니다.


업데이트 : Swift 2부터는 String 더 이상을 준수하지 SequenceType않지만 characters속성은 일련의 유니 코드 문자를 제공합니다.

let string = "Hello 🐶🐮 🇩🇪"
let characters = Array(string.characters)
print(characters)

이것은 스위프트 3 에서도 작동 합니다.


업데이트 : Swift 4부터는 s String컬렉션입니다 Character.

let string = "Hello 🐶🐮 🇩🇪"
let characters = Array(string)
print(characters)
// ["H", "e", "l", "l", "o", " ", "🐶", "🐮", " ", "🇩🇪"]

1
let joined = ", ".join(characters);배열 을 결합 ( ) 하려고 하면 'String' is not identical to 'Character'오류가 발생하는지 알고 있습니까?
Mohamad

3
@Mohamad : 문자열을 열거하면 일련의 문자가 생성되지만 ", ".join(...)문자열 배열이 필요합니다. 아래 devxoul의 ​​답변은 문자열 배열로 분할하는 방법을 보여줍니다.
Martin R

2
@Fonix : characters는 문자열 문자에 대한 모음 및 보기 입니다. 문자에서 배열을 작성하면 사본이 작성됩니다. – 물론 캐릭터에 직접 접근 할 수 있습니다 :for i in string.characters.indices { print(string.characters[i]) }for c in string.characters { print(c) }
Martin R

2
@Fonix : ... 반면에, 문자열에 대한 랜덤 인덱싱은 느릴 수 있으며 모든 문자로 한 번 배열을 만드는 것이 유리할 수 있습니다. 예 : stackoverflow.com/questions/40371929/... .
Martin R

2
@DaniSpringer : Swift 4는 현재 베타 버전이므로 Xcode 9 베타 : developer.apple.com/swift/resources 가 필요합니다 .
Martin R

102

편집 (Swift 4)

스위프트 4에서는 사용하지 않아도 characters사용 map(). 그냥 map()문자열에하십시오.

let letters = "ABC".map { String($0) }
print(letters) // ["A", "B", "C"]
print(type(of: letters)) // Array<String>

또는 더 짧은 것을 선호하는 경우 : "ABC".map(String.init)(2 바이트 😀)

편집 (Swift 2 및 Swift 3)

Swift 2 및 Swift 3에서는 map()기능을 사용 하여 characters속성을 지정할 수 있습니다 .

let letters = "ABC".characters.map { String($0) }
print(letters) // ["A", "B", "C"]

원본 (Swift 1.x)

허용 대답은 순서 변환이 있기 때문에, 최선을 될 것 같지 않습니다 String하지 않은 것입니다 String순서 만 Character:

$ swift
Welcome to Swift!  Type :help for assistance.
  1> Array("ABC")
$R0: [Character] = 3 values {
  [0] = "A"
  [1] = "B"
  [2] = "C"
}

이것은 아래에서 나를 위해 작동합니다.

let str = "ABC"
let arr = map(str) { s -> String in String(s) }

글로벌 함수에 대한 참조 map()는 다음과 같습니다. http://swifter.natecook.com/func/map/


12
약간 더 짧은 :arr = map(str) { String($0) }
Martin R

1
Array대신 이니셜 라이저를 사용하십시오 .Array("ABC".characters)
chrisamanse

1
@ chrisamanse, "ABC".characters와 사이에는 차이가 없습니다 Array("ABC".characters).
devxoul

2
Swift 3에서는 다릅니다 . "ABC".characterstype을 반환합니다 String.CharacterView. 배열, 특히 형식의 배열로 변환하려면 초기화 프로그램 [Character]을 사용해야 Array합니다.
chrisamanse

2
@ chrisamanse 오, 몰랐어요. 내가 틀렸어. 지적 해 주셔서 감사합니다. 그건 그렇고, 내가 의도 [String]하는 대신 [Character]영업 이익은 문자열 배열 : 싶어서
devxoul

22

String에 유용한 기능이 있습니다 : components (separatedBy : String)

let string = "1;2;3"
let array = string.components(separatedBy: ";")
print(array) // returns ["1", "2", "3"]

";"와 같은 문자로 구분 된 문자열을 처리하는 데 효과적입니다. 또는 "\ n"


8

스위프트 4 업데이트

3 가지 방법이 있습니다.

//array of Characters
let charArr1 = [Character](myString)

//array of String.element
let charArr2 = Array(myString)

for char in myString {
  //char is of type Character
}

경우에 따라 사람들이 실제로 원하는 것은 문자열을 각각 1 문자 길이의 작은 문자열 배열로 변환하는 방법입니다. 이를 수행하는 매우 효율적인 방법은 다음과 같습니다.

//array of String
var strArr = myString.map { String($0)}

스위프트 3

3 가지 방법이 있습니다.

let charArr1 = [Character](myString.characters)
let charArr2 = Array(myString.characters)
for char in myString.characters {
  //char is of type Character
}

경우에 따라 사람들이 실제로 원하는 것은 문자열을 각각 1 문자 길이의 작은 문자열 배열로 변환하는 방법입니다. 이를 수행하는 매우 효율적인 방법은 다음과 같습니다.

var strArr = myString.characters.map { String($0)}

또는 문자열에 확장을 추가 할 수 있습니다.

extension String {
   func letterize() -> [Character] {
     return Array(self.characters)
  }
}

그러면 다음과 같이 호출 할 수 있습니다.

let charArr = "Cat".letterize()


3

Martin R 답변이 최선의 접근 방식이며 String이 SquenceType 프로토콜을 준수하기 때문에 각 반복에서 각 문자를 가져 와서 문자열을 열거 할 수도 있습니다.

let characters = "Hello"
var charactersArray: [Character] = []

for (index, character) in enumerate(characters) {
    //do something with the character at index
    charactersArray.append(character)
}

println(charactersArray)

2
하거나 for character in characters { charactersArray.append(character)}포함하지 않는enumeration()
Tieme

3

로 스위프트 4에서 String의 모음입니다 Character, 당신은 사용할 필요가map

let array1 = Array("hello") // Array<Character>
let array2 = Array("hello").map({ "\($0)" }) // Array<String>
let array3 = "hello".map(String.init) // Array<String>

3

이를 수행하는 쉬운 방법 map은 변수를 사용하고 각각을 다음 Character과 같이 반환 하는 것입니다 String.

let someText = "hello"

let array = someText.map({ String($0) }) // [String]

출력은이어야합니다 ["h", "e", "l", "l", "o"].


1

확장을 만들 수도 있습니다.

var strArray = "Hello, playground".Letterize()

extension String {
    func Letterize() -> [String] {
        return map(self) { String($0) }
    }
}

1
func letterize() -> [Character] {
    return Array(self.characters)
}

2
이것이 왜 작동하는지 더 많은 정보를 제공 할 수 있습니까? :)
pix

1
@pix 나는 이것이 이것이 String의 확장에 정의 된 함수라는 것을 의미한다고 생각합니다. 내 답변에 추가하겠습니다.
ScottyBlades

1

String의 함수 : components (separatedBy : String)

스위프트 5.1

로 변경 :

string.split(separator: "/")

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.