2017-05-26 12 views
3

属性付き文字列から属性を取得しようとしています。文字列が空でない限り、すべてが正常です。見てください:NSAttributedStringは範囲外の例外を取得します

let s = NSAttributedString(string: "", attributes: [NSForegroundColorAttributeName: UIColor.red]) 
let range = NSMakeRange(0, s.length) 
let attrs = s.attributes(at: 0, longestEffectiveRange: nil, in: range) 

最後の行に範囲外の例外が表示されるのはなぜですか。

+0

Objective-Cでもクラッシュします。 'if s.string.isEmpty'の前にチェックしますか? – Larme

+0

@Larmeこれは私がこれを解決した方法ですが、なぜこれが起こるのか知りたいのですが – Kubba

答えて

2

これは、予想される結果です。文字列の長さが0の場合( ""の場合)、インデックス0には文字がないため、s.attributesでアクセスしようとすると、範囲外の例外が発生することが予想されます。

インデックスが0から始まるため、インデックス= 0はString.length> 0にのみ存在するためです。

これは、長さ1の文字列を使用し、s.attributesに1を入力することで簡単に確認できます。

let s = NSAttributedString(string: "a", attributes: [NSForegroundColorAttributeName: UIColor.red]) 
let range = NSMakeRange(0, s.length) 
let attrs = s.attributes(at: 1, longestEffectiveRange: nil, in: range) //also produces out of bounds error 
1

longestEffectiveRangeを気にしないので、より効率的なattribute(_:at:effectiveRange:)を使用してください。

空の文字列を呼び出すと、どちらもスローされます。これは、at location:パラメータが文字列の境界内になければならないためです。それのためのドキュメントは言う:

重要

インデックスは、受信機の文字の終わりを超えてある場合rangeExceptionを発生させます。

https://developer.apple.com/reference/foundation/nsattributedstring/1408174-attribute

関連する問題