Search Your Question

What method is called after tap back button in ios?

Ans : 

When you go back the following methods will be called:

Notifies the view controller that its view is about to be added to a view hierarchy : 

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
}


Notifies the view controller that its view was added to a view hierarchy : 

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)

}

What is stored property and computed property?

Ans : 

1. Stored Property : 

A stored property is a constant or variable that is stored as part of an instance of a particular class or structure. Stored properties can be either variable stored properties (introduced by the var keyword) or constant stored properties (introduced by the let keyword).

struct FixedLengthRange {
    var firstValue: Int
    let length: Int
}

So here, firstValue is mutable (var) storedProperty that can have value and change value,
length is immutable (let) computedProperty that can have value but can not be changed.

We can add property observers to any stored properties you define, except for lazy stored properties.

You have the option to define either or both of these observers on a property:
willSet is called just before the value is stored. (newTotalSteps)
didSet is called immediately after the new value is stored. (oldValue)

2. Computed Property :

Classes, structures, and enumerations can define computed properties, which do not actually store a value. Instead, they provide a getter and an optional setter to retrieve and set other properties and values indirectly.

struct Point {
    var x = 0.0, y = 0.0
}
struct Size {
    var width = 0.0, height = 0.0
}
struct Rect {
    var origin = Point()
    var size = Size()
    var center: Point {
        get {
            let centerX = origin.x + (size.width / 2)
            let centerY = origin.y + (size.height / 2)
            return Point(x: centerX, y: centerY)
        }
        set(newCenter) {
            origin.x = newCenter.x - (size.width / 2)
            origin.y = newCenter.y - (size.height / 2)
        }
    }
}

What is priority in constraints?

Ans : 

Constant priority is a number to determine how important is that constraint. The number can range from 1 to 1000, the higher the number goes, the more important a constraint is. Lower priority in screen seen like dashed blue line.

This is useful when two constraint make conflict.

Example :

Let's take one UIView and place them in main view.

Set Leading and Trailing constraint is 40,40.
Set width and height is 240,240.

Now if iPhone SE is selected, then all goes fine. No red line will show about conflicting constraints due to iPhone SE width is 320. So if it takes 40,40 as leading and constraints, it will calculate view's width as 240. And we also set width constraint as 240. So there is no conflicting.

But if iPhone 8 is selected then view's width constraint is conflicting with leading, trailing constraints.
iPhone 8 width = 375 - 40 - 40 = 295 But we have set width constraint as 240. So here conflicting occurs.

Solution : 

If we set width constraint priority 900 then its priority is lower than leading and trailing priority(1000) So width constraint will be ignored here. So when we do some auto layout and we feel conflicting constraint, we can lower priority of constraint according to requirement.


Device token will be changed or not if we uninstall and reinstall the app ?

Ans : 

The Device token is change in the following conditions.

  • If the user restores backup data to a new device.
  • Reinstalls the App
So update to server from app delegate method didRegisterForRemoteNotificationsWithDeviceToken every time. (Just suggestion)

String Interpolation in Swift

Ans : 

String interpolation means creating string from mix of constants, variables, literals, expressions.

let length:Float = 3.14
var breadth = 10
var myString = "Area of a rectangle is length*breadth"
print(myString)
myString = "\(myString) i.e. = \(length)*\(breadth)"
print(myString)

Output :

Area of a rectangle is length*breadth
Area of a rectangle is length*breadth i.e. = 3.14*10

Another way of string interpolcation in Swift :

Use the Swift String initializer:
String(format: <#String#>, arguments: <#[CVarArgType]#>)

For example: let stringFromNumber = String(format: "%.2f", number)

Swift 5.0 has super powerful string interpolation : 

1. Normal custom String interpolation

Code for Example :

Using the new string interpolation system in Swift 5.0 we can extend String.StringInterpolation to add our own custom interpolations

extension String.StringInterpolation {
    mutating func appendInterpolation(_ number: Int) {
        let formatter = NumberFormatter()
        formatter.numberStyle = .spellOut

        if let result = formatter.string(from: number as NSNumber) {
            appendLiteral(result)
        }
    }
}

Use : print("My age is \(age).")
Output : My age is twenty nine.
Above custom interpolation tells to convert integer to word.

Amazing....hua.....


We can also write above function as following :

mutating func appendInterpolation(format number: Int) {

So, we can use like : print("Hi, I'm \(format: age)."). So there will be no confusion between default interpolation and custom interpolation.

2. String interpolation with parameters. : 

mutating func appendInterpolation(linkedin: String) {
    appendLiteral("<a href=\"https://linkedin.com/in/\(linkedin)\">@\(linkedin)</a>")}

output :
"You should follow me on linkedin : <a href="https://linkedin.com/in/twostraws">@twostraws</a>.\n"

We can also pass multiple parameters.

3. We can pass auto closure as parameter :


extension String.StringInterpolation {
    mutating func appendInterpolation(_ values: [String], empty defaultValue: String) {
        if values.count == 0 {
            appendLiteral(defaultValue())
        } else {
            appendLiteral(values.joined(separator: ", "))
        }
    }
}

let names  = [String]()

print("Crew: \(names, empty: "None").")



Using @autoclosure means that we can use simple values or call complex functions for the default value. Here defaultValue() function called for set default value.


extension String.StringInterpolation {
    mutating func appendInterpolation(if condition: @autoclosure () -> Bool, _ literal: StringLiteralType) {
        guard condition() else { return }
        appendLiteral(literal)
    }
}

let amIiOSDeveloper = true
print("Swift rocks: \(if: amIiOSDeveloper, "(*)")")
print("Swift rocks \(amIiOSDeveloper ? "(*)" : "")")


Normally we use 2nd print option at above. But due to custom string interpolation, we can directly use 1st print option.


4. String interpolation with custom type (class or struct)

struct Employee {
    var name: String
    var designation: String
}

extension String.StringInterpolation {
    mutating func appendInterpolation(_ emp: Employee) {
        appendLiteral("I am \(amp.name) and my designation is \(amp.designation).")
    }
}

let manan = Employee(name: "Manan", designation: "Senior Software Engineer")
print("\(manan)")

Print("\(manan)") gives output as :

I am Manan and my designation is Senior Software Engineer.

if we use print(manan) then it gives class debug description because here no string interpolation used.

Awesome...
Thanks Swift 5.0...

If you have any comment, question, or recommendation, feel free to post them in the comment section below!