1

I'm making a calculator app in Swift, once my answer is obtained I want to display it in a UILabel. Only problem is I want to limit said answer to 8 characters. Here is my code:

let answerString = "\(answer)" println(answer) calculatorDisplay.text = answerString.substringToIndex(advance(answerString.startIndex, 8)) 

This does not return any compiler errors but at runtime I get:

fatal error: can not increment endIndex 

Any and all help would be greatly appreciated.

2
  • I think answerString.startIndex, 8) function returning the value greater hte answerstring Commented Mar 26, 2015 at 11:58
  • That is a possibility, and something that could happen in the app. Will try a workaround and get back to you. Commented Mar 26, 2015 at 12:01

1 Answer 1

4

There are two different advance() functions:

/// Return the result of advancing `start` by `n` positions. ... func advance<T : ForwardIndexType>(start: T, n: T.Distance) -> T /// Return the result of advancing start by `n` positions, or until it /// equals `end`. ... func advance<T : ForwardIndexType>(start: T, n: T.Distance, end: T) -> T 

Using the second one you can ensure that the result is within the valid bounds of the string:

let truncatedText = answerString.substringToIndex(advance(answerString.startIndex, 8, answerString.endIndex)) 

Update for Swift 2/Xcode 7:

let truncatedText = answerString.substringToIndex(answerString.startIndex.advancedBy(8, limit: answerString.endIndex)) 

But a simpler solution is

let truncatedText = String(answerString.characters.prefix(8)) 

Update for Swift 3/Xcode 8 beta 6: As of Swift 3, "collections move their index", the corresponding code is now

let to = answerString.index(answerString.startIndex, offsetBy: 8, limitedBy: answerString.endIndex) let truncatedText = answerString.substring(to: to ?? answerString.endIndex) 

The simpler solution

let truncatedText = String(answerString.characters.prefix(8)) 

still works.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.