클래스가 Swift의 프로토콜을 준수하도록 만드는 방법은 무엇입니까?


121

Objective-C에서 :

@interface CustomDataSource : NSObject <UITableViewDataSource>

@end

Swift에서 :

class CustomDataSource : UITableViewDataSource {

}

그러나 오류 메시지가 나타납니다.

  1. 'CellDatasDataSource'유형이 'NSObjectProtocol'프로토콜을 준수하지 않습니다.
  2. 'CellDatasDataSource'유형이 'UITableViewDataSource'프로토콜을 준수하지 않습니다.

올바른 방법은 무엇입니까?


1
오류 메시지의 클래스 이름이 제공된 코드와 일치하지 않는 것 같습니다.
Matt Gibson

2
Swift 클래스는 기본적으로 NSObject에서 상속되지 않습니다. 달리 지정하지 않는 한 자체 기본 클래스입니다.
Tim

답변:


251

'CellDatasDataSource'유형이 'NSObjectProtocol'프로토콜을 준수하지 않습니다.

.NET Framework NSObject를 준수하려면 클래스를 상속 해야합니다 NSObjectProtocol. 바닐라 스위프트 클래스는 그렇지 않습니다. 그러나 많은 부분이 UIKit기대 NSObject합니다.

class CustomDataSource : NSObject, UITableViewDataSource {

}

하지만 이것은:

'CellDatasDataSource'유형이 'UITableViewDataSource'프로토콜을 준수하지 않습니다.

예상됩니다. 클래스가 프로토콜의 모든 필수 메서드를 구현할 때까지 오류가 발생합니다.

그래서 코딩을 얻으십시오 :)


감사합니다 @Alex; 제 Swift 클래스가 UICollectionViewDataSource 프로토콜을 준수하도록하기 위해 꽤 많은 시간을 보냈기 때문에 당신은 제 하루를 구했습니다. 내 클래스에 NSObject 상속을 추가하면 해결되었습니다!
iOS-Coder

1
컴파일 경고만으로 충분하다고 생각하는 사람은 나뿐입니까?
Magoo

@Magoo 확실히 당신은 부족을 의미했습니다. '프로토콜을 따르지 않음'은 나에게 'NSObject에서 상속'을 의미하지 않습니다.
Roy Falk

@RoyFalk 나는 컴파일 경고가 오류에 대해 충분하다는 것을 의미합니다 ... 모든 경우에 전체 프로토콜을 구현할 필요가 없으며 그렇게하기 전에 빌드하고 싶을 수도 있습니다 ... 그것은 큰 문제는 아니지만 약간 불필요하다고 느낍니다. .
Magoo

0

클래스는 프로토콜을 따르기 전에 부모 클래스에서 상속해야합니다. 주로 두 가지 방법이 있습니다.

한 가지 방법은 클래스 NSObjectUITableViewDataSource함께 상속 하고 준수하도록하는 것입니다. 이제 프로토콜의 함수를 수정하려면 다음 override과 같이 함수 호출 전에 키워드를 추가해야 합니다.

class CustomDataSource : NSObject, UITableViewDataSource {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        // Configure the cell...

        return cell
    }
}

그러나 준수해야 할 프로토콜이 많고 각 프로토콜에 여러 위임 기능이있을 수 있으므로 코드가 복잡해집니다. 이 경우를 사용하여 프로토콜 준수 코드를 기본 클래스에서 분리 할 수 있으며 확장 extensionoverride키워드 를 추가 할 필요가 없습니다 . 따라서 위의 코드에 해당하는 것은

class CustomDataSource : NSObject{
    // Configure the object...
}

extension CustomDataSource: UITableViewDataSource {

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath)

        // Configure the cell...

        return cell
    }
}

0

Xcode 9는 Swift Datasource & Delegates의 모든 필수 메소드를 구현하는 데 도움이됩니다.

다음은 예입니다 UITableViewDataSource.

필수 메서드를 구현하기위한 경고 / 힌트를 표시합니다.

여기에 이미지 설명 입력

'수정'버튼을 클릭하면 코드에 모든 필수 메서드가 추가됩니다.

여기에 이미지 설명 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.