| 
        
       | 
      
          
       | 
    
    
      | 
         Swift's way of representing strings as encoding-independent
       | 
      
          
       | 
    
    
      | 
         Unicode characters means that programmers don't have to worry
       | 
      
          
       | 
    
    
      | 
         as much about encoding issues (like Ruby, Python, etc.), but
       | 
      
          
       | 
    
    
      | 
         common operations can be a bit tedious as a result, since you
       | 
      
          
       | 
    
    
      | 
         can't directly index into a string without using a Range
       | 
      
          
       | 
    
    
      | 
         abstraction.
       | 
      
        
import UIKit
 
       | 
    
    
      
         # Concatenation
       | 
      
        
var str = "Hello"
var smile = "😄"
var combined = str + " " + smile
 
       | 
    
    
      
         # Common Operations
       | 
      
        
var length = combined.characters.count // 7
print(combined.lowercaseString)
print(combined.uppercaseString)
 
       | 
    
    
      
         # Working with Characters
       | 
      
        
for char in combined.characters {
    // Loops seven times
    print(char)
}
 
       | 
    
    
      
         # Substrings
       | 
      
        
var trail = combined.substringWithRange(Range<String.Index>(start: str.endIndex, end: combined.endIndex))  // " 😄"
 
       | 
    
    
      
         # Contains
       | 
      
        
if let range = str.rangeOfString("ello") {
    print("ello")                           // ello
} else {
    print("nope")
}
 
       | 
    
    
      | 
         Swift has many string methods, most inherited
       | 
      
          
       | 
    
    
      | 
         from the rich NSString API. But (spoiler alert)
       | 
      
          
       | 
    
    
      | 
         you can add your own too.
       | 
      
          
       | 
    
    
      | 
        
       | 
      
        extension String {
    func beginsWith (str: String) -> Bool {
        if let range = self.rangeOfString(str) {
            return range.startIndex == self.startIndex
        }
        return false
    }
    func endsWith (str: String) -> Bool {
        if let range = self.rangeOfString(str, options:NSStringCompareOptions.BackwardsSearch) {
            return range.endIndex == self.endIndex
        }
        return false
    }
}
print("find".beginsWith("f"))       // true
print("find".beginsWith("fi"))      // true
print("find".beginsWith("fin"))     // true
print("find".beginsWith("find"))    // true
print("find".beginsWith("finder"))  // false
print("find".endsWith("d"))         // true
print("find".endsWith("nd"))        // true
print("find".endsWith("ind"))       // true
print("find".endsWith("find"))      // true
print("find".endsWith(""))          // false
 
       | 
    
    
      
         # Mutating
       | 
      
        combined.splice("🐈".characters, atIndex: combined.rangeOfString(smile)!.startIndex)
combined.removeAtIndex(combined.rangeOfString(smile)!.startIndex)
print(combined)                    // Hello 🐈
 
       |