2016-08-31 22 views
9

範囲内のランダムな絵文字を取得したいと思います。インデックスから値を取得

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)") 

エラー:

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

結果を得るための適切な方法は何ですか?

答えて

8

問題はflatten()を遅延適用されることであり、したがって、むしろIntより、FlattenBidirectionalCollectionIndexによってインデックス付けされた特別なFlattenBidirectionalCollectionを返します。

最も簡単な解決策は、従って、単に熱心にあなたがIntで添字ができる配列を作成する範囲の平坦化を適用するためにArray(_:)コンストラクタ(またはflatMap(_:))を使用することであろう。

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])) 

あなたはなまけ適用されて平坦化を維持したい場合には、コレクションのstartIndexadvancedBy(_:)を使用して(スウィフト2のために)直接FlattenBidirectionalCollectionに添字ができます

スウィフト3では
let randomIndex = flattenEmoji.startIndex.advancedBy(Int(arc4random_uniform(UInt32(flattenEmoji.count)))) 
let randomSign = String(UnicodeScalar(flattenEmoji[randomIndex])) 

たとえば、collections move their indicesとしている場合は、コレクションのindex(_:offsetBy:)メソッドを代わりに使用することをおすすめします。

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

変更emojiRanges宣言:

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

は、その後の人生ははるかに容易になります。あなたはInt

let randomSign = String(UnicodeScalar(emojiRanges[Int(arc4random_uniform(UInt32(emojiRanges.count)))])) 
print("RANDOM \(randomSign)") 
にインデックスを変換する必要があり randomSign

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

関連する問題