rupps
rupps

Reputation: 9887

Swift basic expression

I'm very new to swift, but proficient in other languages like Java, JavaScript, C, ... I'm lost with Swift syntax when it comes to create expressions. Look at this basic example where I just try to find out if one string is contained into another by calling String.rangeOfString that returns an Optional Range (Range?)

This works as expected:

let LEXEMA:String="http://"
let longUrl:String="http://badgirls.many/picture.png"

let range=longUrl.rangeOfString(LEXEMA);
if (range? != nil) {
   // blah
} 

Now I'm trying to combine the expression inside the if, something like:

 if (longUrl.rangeOfString(LEXEMA)? !=nil) {
      // blah
 } 

But I always get syntax errors, the above yields a "Expected Separator" and can't understand why. Done some more tests:

  if (absolutePath.rangeOfString(URL_LEXEMA) !=nil) { }


       Expected Separator before "!"

  if absolutePath.rangeOfString(URL_LEXEMA) !=nil { }


       Braced block of statements is an unused closure

What am I doing wrong?

Upvotes: 2

Views: 128

Answers (4)

Jagjot Kaur
Jagjot Kaur

Reputation: 35

swift is case sensitive language. you need to check about whitespaces as well

if longUrl.rangeOfString(LEXEMA) != nil { 
//your condition
}

there should be space between statement != nil

Upvotes: 1

Airspeed Velocity
Airspeed Velocity

Reputation: 40965

If you’re coming from other like Java, you might be thinking of optionals like pointers/references, and so used to equating them to nil and if non-nil, using them. But this is probably going to lead to more confusion. Instead, think of them like a container for a possible result, that you need to unwrap to use. if let combines the test and unwrapping operation.

With this in mind, here’s how you could adapt your code:

let LEXEMA: String="http://"
let longUrl: String="http://badgirls.many/picture.png"

if let range = longUrl.rangeOfString(LEXEMA) {
    // use range, which will be the unwrapped non-optional range
}
else {
    // no such range, perhaps log an error if this shouldn’t happen
}

Note, that ? suffixing behaviour you were using changes in Swift 1.2 so even the code in your question that compiles in 1.1 won’t in 1.2.

It’s possible that sometimes you are whether there was a value returned, but you don’t actually need that value, just to know it wasn’t nil. In that case, you can compare the value to nil without the let:

if longUrl.rangeOfString(LEXEMA) != nil {
    // there was a value, but you don't care what that value was
}

That said, the above is probably better expressed as:

if longUrl.hasPrefix(LEXEMA) { }

Upvotes: 5

clearlight
clearlight

Reputation: 12615

For starters:

  • You don't need parenthesis with if statements unless you have nested parenthetical subexpressions that require it.

  • You don't need to specify the type on the left side of the = of a let or var declaration if Swift can figure it out from the right side of the =. Very often Swift can figure it out, and you can tell that Swift can figure it out, so you can avoid that redundant clutter.

  • You do need to specify the type if Swift cannot figure out the type from the right side. Example:

For example, consider the following lines:

let LEXEMA = "http://"
let longUrl = "http://badgirls.many/picture.png"

Swift can figure out that they're strings.

Similarly for this function or class that returns a UIView:

var myView = ViewReturningClassOrFunc()

Consider this:

@IBOutlet var myView : UIView!

In the above line, Swift cannot figure out ahead of time it will be assigned a UIView, so you have to provide the type. By providing a ! at the end you've made it an implicitly unwrapped optional. That means, like ?, you're indicating that it can be nil, but that you are confident it will never be nil at the time you access it, so Swift won't require you to put a ! after it when you reference it. That trick is a time saver and big convenience.

You should NOT add the ? to the line:

if (longUrl.rangeOfString(URL_LEXEMA) !=nil) {

As another answer pointed out, you're missing the let.

if let longUrl.rangeOfString(URL_LEXEMA) {
     println("What do I win? :-)")
}

Upvotes: 2

mrahmiao
mrahmiao

Reputation: 1311

Just add a space between != and nil like:

if longUrl.rangeOfString(LEXEMA) != nil {
  // blah
}

I tested your code in playground, an error of Expected ',' separator reported.

And do not forget the rules that 1s and 0s and Airspeed Velocity said.

Upvotes: -1

Related Questions