Swift dizesini diziye dönüştür


135

Swift'de bir "Merhaba" dizesini ["H", "e", "l", "l", "o"] dizisine nasıl dönüştürebilirim?

Objective-C'de şunu kullandım:

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];
}

Yanıtlar:


342

Swift'de daha da kolay:

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

Bu şu gerçekleri kullanır:

  • bir Array, a'dan oluşturulabilir SequenceTypeve
  • StringSequenceTypeprotokole uygundur ve sıra oluşturucu karakterleri numaralandırır.

Ve Swift dizeleri Unicode için tam destek sağladığından, bu "Temel Çok Dilli Düzlem" dışındaki karakterlerde (🐶 gibi) ve genişletilmiş grafik kümeleriyle (aslında iki Unicode skalasından oluşan 🇩🇪 gibi ) bile çalışır.


Güncelleme: Swift 2'den itibaren String artık uyumlu değildir SequenceType, ancak charactersözellik Unicode karakterlerinin bir dizisini sağlar:

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

Bu, Swift 3'te de çalışır .


Güncelleme: Swift 4 itibariyle String , (yine) kendi koleksiyonlarından Character:

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

1
let joined = ", ".join(characters);Diziye ( ) katılmaya çalışmanın neden bir 'String' is not identical to 'Character'hatayla sonuçlandığına dair bir fikriniz var mı?
Mohamad

3
@Mohamad: Bir dizeyi numaralandırmak bir dizi karakter üretir, ancak ", ".join(...)bir dizi dizesi bekler. devxoul'un aşağıdaki cevabı bir dizi diziye nasıl ayrılabileceğinizi gösterir.
Martin R.

2
@Fonix: karakter dizileri üzerine charactersbir koleksiyon ve görünümdür . Karakterlerden bir dizi oluşturmak bir kopya oluşturur. - Elbette karakterlere doğrudan erişebilir: for i in string.characters.indices { print(string.characters[i]) }veya sadecefor c in string.characters { print(c) }
Martin R

2
@Fonix: ... Öte yandan, dizelere rastgele indeksleme yavaş olabilir ve tüm karakterleri bir defada içeren bir dizi oluşturmak avantajlı olabilir. Örnek: stackoverflow.com/questions/40371929/… .
Martin R

2
@DaniSpringer: Swift 4 şu anda beta sürümünde, Xcode 9 beta'ya ihtiyacınız olacak: developer.apple.com/swift/resources .
Martin R

102

Düzenle (Swift 4)

Swift 4'te kullanmak charactersiçin kullanmak zorunda değilsin map(). Sadece map()String'de yap.

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

Veya daha kısa olmasını tercih ederseniz: "ABC".map(String.init)(2 bayt 😀)

Düzenle (Swift 2 ve Swift 3)

Swift 2 ve Swift 3'te, mülkiyet için map()işlevi kullanabilirsiniz characters.

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

Orijinal (Swift 1.x)

Kabul edilen yanıt en iyisi gibi görünmüyor, çünkü dizi dönüştürülmüş Stringbir Stringdizi değil , ancak Character:

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

Aşağıdaki bu benim için çalışıyor:

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

Global bir işlev için referans map()burada: http://swifter.natecook.com/func/map/


12
Biraz daha kısa:arr = map(str) { String($0) }
Martin R.

1
Kullanım Arrayyerine başlatıcı:Array("ABC".characters)
chrisamanse

1
@chrisamanse, "ABC".charactersve arasında fark yok Array("ABC".characters).
devxoul

2
Swift 3'te durum farklı. "ABC".charactersBir tür döndürür String.CharacterView. Bir diziye, özellikle de türe dönüştürmek için, üzerindeki başlatıcıyı [Character]kullanmanız Arraygerekir.
chrisamanse

2
@chrisamanse Oh, bunu bilmiyordum. Ben hatalıydım. Gösterdiğiniz için teşekkürler. Bu arada, op bir dizi dizisi istediği için [String]bunun yerine niyet ettim [Character]:)
devxoul

22

String: bileşenlerinde de bu kullanışlı işlev vardır (ayrıldıBy: String)

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

";" Gibi bir karakterle ayrılmış dizelerle iyi çalışır. hatta "\ n"


8

Swift 4 için güncellendi

İşte 3 yol.

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

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

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

Bazı durumlarda, insanların gerçekten istediği şey, bir dizeyi her biri 1 karakter uzunluğunda olan küçük dizelere dönüştürmenin bir yoludur. İşte bunu yapmanın süper verimli bir yolu:

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

Hızlı 3

İşte 3 yol.

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

Bazı durumlarda, insanların gerçekten istediği şey, bir dizeyi her biri 1 karakter uzunluğunda olan küçük dizelere dönüştürmenin bir yoludur. İşte bunu yapmanın süper verimli bir yolu:

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

Veya String'e bir uzantı ekleyebilirsiniz.

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

O zaman şöyle diyebilirsiniz:

let charArr = "Cat".letterize()


3

Martin R cevabı en iyi yaklaşımdır ve dediği gibi, String SquenceType protokolüne uyduğundan, her yinelemede her karakteri alarak bir dizeyi de numaralandırabilirsiniz.

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
Ya da sadece for character in characters { charactersArray.append(character)}olmadanenumeration()
Tieme

3

Swift 4'te, Stringbir koleksiyon olduğu gibi Character, kullanmanız gerekirmap

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

3

Bunu yapmanın kolay bir yolu mapdeğişkene gitmek ve her birini aşağıdaki Charactergibi döndürmektir String:

let someText = "hello"

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

Çıktı olmalıdır ["h", "e", "l", "l", "o"].


1

Ayrıca bir uzantı da oluşturabilirsiniz:

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

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

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

2
Bunun neden işe yarayacağına dair daha fazla bilgi verebilir misiniz? :)
pix

1
@pix Sanırım bunun String'in bir uzantısında tanımlanan bir işlev olmasını kastetti. Bunu cevabıma ekleyeceğim.
ScottyBlades

1

String üzerindeki işlev için: bileşenler (ayrıldıBy: String)

Swift 5.1'de

değiştirmek var:

string.split(separator: "/")

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.