2016-10-19 7 views
0

getBytescopyBytes)を使用してバイトを読み取るためにNSData(またはData)を使用すると、NSRangeExceptionがスローされます。私はそれらを捉える方法を知らない。NSData(データ)範囲例外の処理

私はNSData含めNSクラスのために、私は例外をキャッチして処理するためのObjective-Cラッパーを使用する必要がありますが、私はDataもスウィフトがネイティブで処理できない例外をスローすることを見て少し驚いていることを知っています。

明らかなものがありませんか?純粋なスウィフトを使ってそれらを捕まえる方法はありますか?または、迅速な処理可能なエラーをスローする他の方法がありますか? (実際に私は、ファイルから作成されたデータを使用しています)失敗し

コード例は

// Using NSData 

let dataBytes:[UInt8] = [0xff, 0x00, 0x11, 0x22] 
let data = NSData(bytes: dataBytes, length: dataBytes.count) 
let dataRange = NSRange(location: 2, length: 4) 

var result = [UInt8](repeating: 0, count: 4) 

do 
{ 
    try data.getBytes(&result, range: dataRange) 
    print("OK") 
} 
catch 
{ 
    print("FAIL") 
} 


// Using Data 

let dataBytes:[UInt8] = [0xff, 0x00, 0x11, 0x22] 
let data = Data(dataBytes) 
let dataRange = Range(2..<6) 

var result = [UInt8](repeating: 0, count: 4) 

do 
{ 
    try data.copyBytes(to: &result, from: dataRange) 
    print("OK") 
} 
catch 
{ 
    print("FAIL") 
} 

注:問題のコードは、(スウィフトはそれらを処理できないので、期待通りに)2回の警告を示すが、Iそれらをtry...catchブロックに追加して、私が使いたいものを表示するだけです。投げ機能へ

ませ呼び出しが

+1

'Data copyBytes'はスローしないので、キャッチするものはありません。 – rmaddy

+0

@rmaddyそれは問題の要点です。それはスローされませんが、アプリをクラッシュさせます。 Objective-Cに傾倒することは、レーストラックに3馬の馬を持つようなものです...これを回避する方法はありますか? copyBatesの使用は必須ではありません。それは、それが提供する機能です。 –

+0

'NSRangeException'は実行時に' do-try-catch'フローで捕らえられません。プログラミングエラーです。あなたはコレクション型の範囲外に出ています。 – JAL

答えて

1

あなたがいることを確認する必要があるエラーが「行う」ブロックでスローされていないので、

「キャッチ」ブロックが到達不能である式「してみてください」内で発生していません

if dataRange.upperBound <= data.count { 
    data.copyBytes(to: &result, from: dataRange) 
} 

は、あなたが複数のアレイ/コッレようDataと考えることができます:あなたが使用している範囲の上限のインデックスは、データの範囲外ではありませんction。 copyBytesは、同じ理由でキャッチ可能な例外なしで失敗します。anArray[1]は、1つのアイテム配列に対して失敗します。