Zdeněk Topič
Zdeněk Topič

Reputation: 780

Swift protocol method usage

So I've started learning Swift, because it looks way better than ObjC. However I must be tired (its 2:37 AM here right now) because I cant see issue why Xcode screams I am trying to call undefined member. See the code below:

PeopleStackViewDataSource.swift

import Foundation
import UIKit

protocol PeopleStackViewDataSource {

    func stackViewNumberOfItems(stackView: PeopleStackView) -> Int
    func stackViewGetView(indexPath: NSIndexPath) -> UIView
}

PeopleStackView.swift

import Foundation
import UIKit

class PeopleStackView: UIView {

    var datasource: PeopleStackViewDataSource? {
    didSet {
        self.redraw()
    }
    }

    var scaleDownBy: Double = 0.1

    init(frame: CGRect) {
        super.init(frame: frame)

    }

    init(frame: CGRect, datasource: PeopleStackViewDataSource) {
        super.init(frame: frame);
        self.datasource = datasource;
    }

    func numberOfItems() -> Int {
        return self.datasource ? self.datasource.stackViewNumberOfItems(self) : 0
    }

    func redraw() {

    }


}

The issue is this line return self.datasource ? self.datasource.stackViewNumberOfItems(self) : 0 where Xcode says that stackViewNumberOfItems(self)

PeopleStackViewDataSource?' does not have a member named 'stackViewNumberOfItems

So, where is the issue?

Upvotes: 1

Views: 1081

Answers (1)

Gabriele Petronella
Gabriele Petronella

Reputation: 108151

The issue is that

PeopleStackViewDataSource?' does not have a member named 'stackViewNumberOfItems

but PeopleStackViewDataSource does (notice the ?)

You need to unwrap the optional datasource.

func numberOfItems() -> Int {
    if let ds = self.datasource {
        return ds.stackViewNumberOfItems(self)
    } else { return 0 }          
}

Upvotes: 3

Related Questions