Swift - which types to use? NSString or String
ios, macos, objective-c, string, swift
Solution
You should use the Swift native types whenever possible. The language is optimized to use them, and most of the functionality is bridged between the native types and the `Foundation` types.
While `String` and `NSString` are mostly interchangeable, i.e, you can pass `String` variables into methods that take `NSString` parameters and vice versa, some methods seem to not be automatically bridged as of this moment. See this answer for a discussion on how to get the a String's length and this answer for a discussion on using `containsString()` to check for substrings. (Disclaimer: I'm the author for both of these answers)
I haven't fully explored other data types, but I assume some version of what was stated above will also hold true for `Array`/`NSArray`, `Dictionary`/`NSDictionary`, and the various number types in Swift and `NSNumber`
Whenever you need to use one of the Foundation types, you can either use them to type variables/constants explicitly, as in `var str: NSString = "An NSString"` or use `bridgeToObjectiveC()` on an existing variable/constant of a Swift type, as in `str.bridgeToObjectiveC().length` for example. You can also cast a `String` to an `NSString` by using `str as NSString`.
However, the necessity for these techniques to explicitly use the Foundation types, or at least some of them, may be obsolete in the future, since from what is stated in the language reference, the `String`/`NSString` bridge, for example, should be completely seamless.
For a thorough discussion on the subject, refer to Using Swift with Cocoa and Objective-C: Working with Cocoa Data Types
Problem
With the introduction of Swift I've been trying to get my head round the new language I'm an iOS developer and would use types such as `NSString, NSInteger, NSDictionary` in an application. I've noticed that in the "The Swift Programming Language" ebook by Apple, they use the Swift types `String, Int, Dictionary` I've noticed the Swift types don't have (or are differently named) some of the functions that the Foundation types do. For example `NSString` has a `length` property. But I've not been able to find a similar one for the Swift `String`. I'm wondering, for an iOS application should I still be using the Foundation types?