Property in Swift - Computed property | Property Observers (WillSet & DidSet)

   Computed property -  Computed properties are part of a property type in Swift.  Stored properties are the most common which save and return a stored value  Computed properties calculate (rather than store) a value. A computed property provides a getter and an optional setter to indirectly access other properties and values. Computed property in swift is an interesting topic as you can write code inside a property in swift. Computed properties are provided by classes, structures, and enumerations but stored properties are provided only by classes and structures. This computed property swift tutorial has some tips on how to use the computed property in the right way and avoid the common mistakes that swift programming beginners do while computed property. Example :- Computed property A Calculate Simple Intrest struct CalculateLoan {      var amount : Int      var rate : Int      var years : Int      var simpleInterest: Int {          get {              return ( amount * rate

JSON Parsing with Codable in Swift - Nested JSON Model

#Swift, to supporting decoding and encoding we must adopt the #NSCoding protocol and implement its methods. 

#Apple has introduced a new way to decode and encode the #JSON data using with Codable since Swift 4. 

You need to consume the following API to search and display images. - Flickr

Https://www.flickr.com/services/api/flickr.photos.search.htm The API results in search results for a

Documentation on this page to get the image URLS:

https://www.flickr.com/services/api/misc.urls.html

XXXXXXXX - API Key

Open Test Api - https://api.flickr.com/services/rest/?method=flickr.galleries.getPhotos&api_key=XXXXXXXX&gallery_id=66911286-72157647277042064&format=json&nojsoncallback=1


Model: - 

import Foundation


struct ResponseCodable : Codable {

    let photos : Photos?

    let stat : String?


    enum CodingKeys: String, CodingKey {


        case photos = "photos"

        case stat = "stat"

    }


    init(from decoder: Decoder) throws {

        let values = try decoder.container(keyedBy: CodingKeys.self)

        photos = try values.decodeIfPresent(Photos.self, forKey: .photos)

        stat = try values.decodeIfPresent(String.self, forKey: .stat)

    }


}


struct Photos : Codable {

    let page : Int?

    let pages : Int?

    let perpage : Int?

    let total : Int?

    let photo : [Photo]?


    enum CodingKeys: String, CodingKey {


        case page = "page"

        case pages = "pages"

        case perpage = "perpage"

        case total = "total"

        case photo = "photo"

    }


    init(from decoder: Decoder) throws {

        let values = try decoder.container(keyedBy: CodingKeys.self)

        page = try values.decodeIfPresent(Int.self, forKey: .page)

        pages = try values.decodeIfPresent(Int.self, forKey: .pages)

        perpage = try values.decodeIfPresent(Int.self, forKey: .perpage)

        total = try values.decodeIfPresent(Int.self, forKey: .total)

        photo = try values.decodeIfPresent([Photo].self, forKey: .photo)

    }


}


struct Photo : Codable {

    let id : String?

    let owner : String?

    let secret : String?

    let server : String?

    let farm : Int?

    let title : String?

    let ispublic : Int?

    let isfriend : Int?

    let isfamily : Int?

    let is_primary : Int?

    let has_comment : Int?


    enum CodingKeys: String, CodingKey {


        case id = "id"

        case owner = "owner"

        case secret = "secret"

        case server = "server"

        case farm = "farm"

        case title = "title"

        case ispublic = "ispublic"

        case isfriend = "isfriend"

        case isfamily = "isfamily"

        case is_primary = "is_primary"

        case has_comment = "has_comment"

    }


    init(from decoder: Decoder) throws {

        let values = try decoder.container(keyedBy: CodingKeys.self)

        id = try values.decodeIfPresent(String.self, forKey: .id)

        owner = try values.decodeIfPresent(String.self, forKey: .owner)

        secret = try values.decodeIfPresent(String.self, forKey: .secret)

        server = try values.decodeIfPresent(String.self, forKey: .server)

        farm = try values.decodeIfPresent(Int.self, forKey: .farm)

        title = try values.decodeIfPresent(String.self, forKey: .title)

        ispublic = try values.decodeIfPresent(Int.self, forKey: .ispublic)

        isfriend = try values.decodeIfPresent(Int.self, forKey: .isfriend)

        isfamily = try values.decodeIfPresent(Int.self, forKey: .isfamily)

        is_primary = try values.decodeIfPresent(Int.self, forKey: .is_primary)

        has_comment = try values.decodeIfPresent(Int.self, forKey: .has_comment)

    }


}


Request method:-


        var photoList = [Photo]()



        if let url = URL(string: urlString) {

            if let data = try? Data(contentsOf: url) {

                // we're OK to parse!

                parse(json: data)

            }

        }




func parse(json: Data) {

        let decoder = JSONDecoder()

        do{

            let jsonPetitions = try decoder.decode(ResponseCodable.self, from: json)

            print(jsonPetitions)

            let dataInfo = jsonPetitions.photos?.photo

            photoList = dataInfo!

        }catch{

            print(error.localizedDescription)

        }

    }

Comments