On 2015-12-06 03:02, Michel Fortin wrote:

Apple's API is still rather verbose and hard to discover, but that is
not swift's fault.

They could have gone the D route by separating the method name from
the selector:

extern(Objective-C) class Foo
{
     void bar()
@selector("thisIsMyReallyLongSelector:withAnotherSelector:");
}

You can do that in Swift too with @objc(some:selector:).

But they (Apple) didn't choose to use that feature ;)

And for Swift 3  they do plan to give Swift-specific names to pretty much all 
methods in
the Apple frameworks.
https://github.com/apple/swift-evolution/blob/master/proposals/0005-objective-c-name-translation.md

Seems interesting.

You can be less verbose if you want:

     let str = "Hello, playground"
     str[str.startIndex.advancedBy(2) ..< str.endIndex.advancedBy(-1)]

I tried that but couldn't make it to work. Not sure what I did wrong.

Also note that those special index types are actually iterators.

Aha, I didn't know that.

You're decoding characters (grapheme clusters) as you advance those indexes.

Not really what I needed, for me it would be enough with slicing the bytes.

It's called indexOf. (Remember, the index type is an iterator.) It does
return an optional. It will work for any type conforming to the
ContainerType protocol where Element conforms to Equatable. Like this:

     let str = "Hello, playground"
     let start = str.unicodeScalars.indexOf("p")!
     let end = str.unicodeScalars.indexOf("g")!
     str.unicodeScalars[start ..< end] // "play"
     str.unicodeScalars[start ... end] // "playg"

I was looking for a method to return the first element matching a predicate.

If it's an iterator I would expect to be able to get the value it points to. I can't see how I can do that with an Index in Swift.

--
/Jacob Carlborg

Reply via email to