Swift 4.0 is a major new release for everyone's favorite app development language, and introduces a variety of features that let us write simpler, safer code. Swift 4 release is designed around two primary goals: to provide source stability for Swift 3 code and to provide ABI stability for the Swift standard library

WARNING: Swift 4 is still under active development. Please keep in mind that more features are likely ship in the months before final release.

Multi-Line String Literals — SE-0168

Adding new lines using \n and escaping double quotes in string is not always pleasant task.
 

let multiLineString = """
This is one of the best feature add in Swift 4
It let’s you write “Pradeep Chauhan” new lines without need of “\n”
"""
print(multiLineString)

 

Smart KeyPaths: Key-Value Coding — SE-0161

You can grab root object name and drill down upto any property name to get its value. Key path starts with \ operator.

struct Address {
  var city:String
  var state:String
}
struct User {
  var name: String
  var addresses: [Address]
  
  var primaryAddress: Address {
      return addresses.first!
  }
}

Now If we have friend object and want to get the value then following key path syntax should be used.

print(user[keyPath:\User.primaryAddress.state])

 

Swift Archival & Serialization — SE-0166

Good News! Swift 4 comes with built in encoders and decoders for JSON. JSON <-> Model conversion is comes built in ( Although you can customize that behavior if required ).
Swift 4 introduces a new Codable protocol that lets you serialize and deserialize custom data types without writing any special code – and without having to worry about losing your value types. Even better, you can choose how you want the data to be serialized: you can use classic property list format or even JSON.

 

struct Address:Codable {
  var city:String
  var state:String
}
struct User: Codable {
  var name: String
  var address: Address
}

Encoding ( Model -> JSON )

Let's fill out some details
let address = Address(city: "Udaipur", state: "Rajasthan")
let user = User(name: "pradeep Chauhan", address: address)

let encoder = JSONEncoder() // Define JSONEncoder
if let encoded = try? encoder.encode(user) {
  if let json = String(data: encoded, encoding: .utf8) {
    print(json)
  }
}

Decoding ( JSON -> Model )

let decoder = JSONDecoder()
if let decoded = try? decoder.decode(User.self, from: encoded) {
  print(decoded.name)
  print(decoded.address)
}


Strings are collections again— SE-0163

This is a small change, but one guaranteed to make a lot of people happy: strings are collections again. This means you can reverse them, loop over them character-by-character, map() and flatMap() them, and more. For example:

let str = "What's new in swift 4"

for ch in str {
    print(ch)
}

 

MutableCollection.swapAt— SE-0173

New swap function now takes indices of elements which are to be swapped.

var list = ["Pradeep","Chauhan","iOS","Developer"]
list.swapAt(1,2)

Output.
["Pradeep","iOS","Chauhan","Developer"]

 

One-sided Ranges— SE-0172

Now we can use one side range where missing side will automatically treated as start or end of sequence.

let list = ["Pradeep","Chauhan","iOS","Developer"]
let firstTwo = names[..<2]
let lastThree = names[1…]
print(firstTwo)
print(lastThree)
Which will produce following output.
["Pradeep", "Chauhan"] // [..<2] => [0,1]
["Chauhan","iOS","Developer"] // list[2…] => [1,2,3]

 

Dictionary and Set enhancements— SE-0165

  1. you can create a dictionary using array elements.
    let users = ["Ajay", "Ratish", "Vishal"]
    let usersDictionary = Dictionary(uniqueKeysWithValues: zip(1…, users))
    print(usersDictionary)

    Which will produce following output.

    ["0":"Ajay", "1":"Ratish", "2":"Vishal"]