2016-08-31 6 views
9

Ich möchte ein zufälliges Emoji innerhalb des Bereichs abrufen.Erhalte einen Wert im Index vom Bereich

let emojiRanges = [ 
        0x1F601...0x1F64F, 
        0x1F680...0x1F6C0, 
       ] 
       let flattenEmoji = emojiRanges.flatten() 
// the loop for emoji works 
       for i in flattenEmoji { 

        let st = String(format:"0x%2X %@", i, String(UnicodeScalar(i))) 
        print(st) 
       } 

// but this is not possible to obtain value at wanted index 
//there is a compiler error: 
       let randomSign = String(UnicodeScalar(flattenEmoji[arc4random_uniform(UInt32(flattenEmoji.count))])) 
       print("RANDOM \(randomSign)") 

der Fehler:

ViewController.swift:68:67: Cannot subscript a value of type 'FlattenBidirectionalCollection<[Range]>' (aka 'FlattenBidirectionalCollection>>') with an index of type 'UInt32'

Was ist der richtige Weg, um ein Ergebnis zu bekommen?

Antwort

8

Das Problem ist, dass flatten() träge angewendet wird, und deshalb gibt einen speziellen FlattenBidirectionalCollection, die durch eine FlattenBidirectionalCollectionIndex indiziert ist, eher als ein Int.

Die einfachste Lösung wäre daher einfach den Array(_:) Konstruktor zu verwenden (oder flatMap(_:)), um die Abflachung der Bereiche mit Spannung anwenden, die ein Array erstellen, die Sie dann mit einem Int SUBSCRIPT können.

let flattenEmoji = Array(emojiRanges.flatten()) // In Swift 3, flatten() is named joined() 

let randomIndex = Int(arc4random_uniform(UInt32(flattenEmoji.count))) 
let randomSign = String(UnicodeScalar(flattenEmoji[randomIndex])) 

Wenn Sie die Abflachung behalten möchten träge angewendet wird, könnten Sie die FlattenBidirectionalCollection direkt SUBSCRIPT (für Swift 2) durch advancedBy(_:) mit auf die Sammlung des startIndex:

let randomIndex = flattenEmoji.startIndex.advancedBy(Int(arc4random_uniform(UInt32(flattenEmoji.count)))) 
let randomSign = String(UnicodeScalar(flattenEmoji[randomIndex])) 

In Swift 3 , wie collections move their indices, möchten Sie stattdessen die index(_:offsetBy:) Methode der Sammlung verwenden:

let randomIndex = flattenEmoji.index(flattenEmoji.startIndex, offsetBy: Int(arc4random_uniform(UInt32(flattenEmoji.count)))) 
4

ändern emojiRanges Erklärung dazu:

let emojiRanges = Array(0x1F601...0x1F64F) + Array(0x1F680...0x1F6C0) 

dann wird das Leben viel einfacher geworden.

for i in emojiRanges { 
    let st = String(format:"0x%2X %@", i, String(UnicodeScalar(i))) 
    print(st) 
} 

in randomSign sollten Sie Index Int

let randomSign = String(UnicodeScalar(emojiRanges[Int(arc4random_uniform(UInt32(emojiRanges.count)))])) 
print("RANDOM \(randomSign)") 
konvertieren
Verwandte Themen