2016-04-25 7 views
2
let myArray = Array(arrayLiteral: userIDs) 
let newArray = myArray.map{$0 as! UInt} 

次のエラーは何を意味しますか?Swift array.map conver NSNumber to UInt

キャスト 'セット?'関連性のない型「UINT」にいつも私がUIntの代わりに数字で配列にNSSetから作成された配列を変換したい

失敗しました。

+5

キャストの代わりに 'unsignedIntegerValue'メソッドを使ってみましたか? 'let newArray = myArray.map {$ 0!.unsignedIntegerValue}' – dasblinkenlight

+4

'userIDs'とは何ですか? - 実際に 'xxxLiteral:'コンストラクタを明示的に呼び出す必要がある場合はわかりませんので、別の問題を回避するためにそれを行ったと仮定します。 –

+0

@MartinRそれはnsnumbersのセットです –

答えて

3

userIDs場合。

let num1 = NSNumber(integer: 33) 
let num2 = NSNumber(integer: 42) 
let num3 = NSNumber(integer: 33) 
let nums = [num1, num2, num3] // [33, 42, 33] 
let userIDs = Set(nums) // {33, 42} 
let myArray = Array(userIDs) // [33, 42] 

は、その後、あなたが好きにマッピングすることができます:

let newArray = myArray.map{ UInt($0) } 

UPDATEコメント

た後、あなたの代わりに財団のNSSetをお持ちの場合は

arrayLiteralのinitを削除しますスウィフトセット、これを行うことができます:

let userIDs = NSSet(array: nums) 
let myArray = userIDs.map { $0 as! NSNumber } 
let newArray = myArray.map { UInt($0) } 

NSSetの内容はNSSetに保持されないため、NSSetの内容をNSNumberにダウンキャストする必要があります。

+0

hmが、私はlet myArray = Array(userIDs)を使用することを許可していません、Xcodeは多分arrayLiteralを追加したいと言います。実際に私はあなたのようにセットを作成しない、私はそれがNSSet、私は違いがあるかどうかわからないポッドの目的のCファイルからそれを得る。 –

+0

私は自分の答えを更新しました。 – Moritz

+0

ha、私たちは 'Set from ''と無関係の 'NSNumber'に常に失敗しました。 NSNumber} ' –

0

NSSetである場合、myArrayは、NSSetの1つの要素を持ちます。あなたは、しかし、ユーザーIDを介してマップすることができます。

let userIDs: NSSet = NSSet(array: [ NSNumber(int:1), NSNumber(int:2), NSNumber(int:3) ]) 

let myArray = Array(arrayLiteral: userIDs) 
print(myArray.count) // returns 1 
print(myArray[0].dynamicType) 

let newArray = userIDs.map { x -> UInt in 
    print(x.dynamicType) 
    return x as! UInt 
} 

for x in newArray { 
    print(x.dynamicType) 
} 

これは遊び場で得られます。Set<NSNumber>はその後、設定内容から配列を作成しませんArray(arrayLiteral: userIDs)やって、それがセット自体を含む配列を作成している

1 
__NSSetI 
__NSCFNumber 
__NSCFNumber 
__NSCFNumber 
UInt 
UInt 
Uint 
関連する問題