2017-05-26 2 views
3

Ich versuche, Attribute von attributierten String zu bekommen. Alles ist in Ordnung, es sei denn, String ist leer. Werfen Sie einen Blick:NSAttributedString bekomme Attribute außerhalb der Grenzen Ausnahme

Warum bekomme ich Out-of-Bounds-Ausnahme in der letzten Zeile?

+0

Es stürzt auch in Objective-C. Überprüfen Sie vor 'if s.string.isEmpty'? – Larme

+0

@Larme, das ist, wie ich das gelöst habe, aber ich würde gerne wissen, warum das passiert – Kubba

Antwort

2

Dies ist das erwartete Ergebnis. Wenn die Länge einer Zeichenfolge 0 ist (der Fall für ""), hat sie kein Zeichen bei Index 0. Wenn Sie also versuchen, mit s.attributes auf sie zuzugreifen, wird erwartet, dass Sie eine Ausnahmebedingung erhalten.

Da die Indizierung von 0 aus beginnt, ist index = 0 nur für String.length> 0 vorhanden.

Sie können dies leicht überprüfen, indem Sie eine Zeichenfolge der Länge 1 verwenden und 1 an s.attributes eingeben.

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

Da Sie sich nicht für den längsten EffectiveRange interessieren, verwenden Sie attribute(_:at:effectiveRange:), was effizienter ist.

Beide werden ausgelöst, wenn Sie eine leere Zeichenfolge aufrufen. Dies liegt daran, dass der Parameter at location: innerhalb der Grenzen der Zeichenfolge liegen muss. Die Dokumentation für sie sagen:

Wichtige

Löst ein rangeException wenn der Index über das Ende des Empfängers Zeichen liegt.

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

Verwandte Themen