ios - 전달 - Swift 프로토콜에서 옵션 메소드를 정의하는 방법은 무엇입니까?




swift protocol delegate (10)

스위프트에서 가능합니까? 그렇지 않다면 해결 방법이 있습니까?


Swift 2에서는 프로토콜의 기본 구현을 추가 할 수 있습니다. 이것은 프로토콜에서 선택적 메소드의 새로운 방법을 만듭니다.

protocol MyProtocol {
    func doSomethingNonOptionalMethod()
    func doSomethingOptionalMethod()
}

extension MyProtocol {
    func doSomethingOptionalMethod(){ 
        // leaving this empty 
    }
}

선택적인 프로토콜 메소드를 만드는 것은 좋은 방법이 아니지만 프로토콜 콜백에서 구조체를 사용할 수있는 가능성을 제공합니다.

나는 여기에 작은 요약을 썼다 : http://www.avanderlee.com/swift-2-0/optional-protocol-methods/


다음은 구조 나 열거 형이 아닌 신속한 클래스 전용 예제입니다. 선택 사항 인 프로토콜 방법에는 두 가지 레벨의 선택 체인이 있습니다. 또한 프로토콜을 채택한 클래스는 선언에 @objc 속성이 필요합니다.

@objc protocol CollectionOfDataDelegate{
   optional func indexDidChange(index: Int)
}


@objc class RootView: CollectionOfDataDelegate{

    var data = CollectionOfData()

   init(){
      data.delegate = self
      data.indexIsNow()
   }

  func indexDidChange(index: Int) {
      println("The index is currently: \(index)")
  }

}

class CollectionOfData{
    var index : Int?
    weak var delegate : CollectionOfDataDelegate?

   func indexIsNow(){
      index = 23
      delegate?.indexDidChange?(index!)
    }

 }

선택적 프로토콜 방법을 구현하는 방법 을 묻기 전에 구현해야하는지 묻는 것이 좋습니다.

고전적인 객체 지향 프로그래밍에서 Interface 라는 신속한 프로토콜을 생각해 보면 선택적인 방법은별로 의미가 없으며 기본 구현을 작성하거나 프로토콜을 프로토콜 집합으로 분리하는 것이 더 나은 해결책 일 수 있습니다 (어쩌면 상속 관계가 있음). 사이의) 프로토콜의 가능한 조합을 나타냅니다.

자세한 내용은 https://useyourloaf.com/blog/swift-optional-protocol-methods/ 참조 https://useyourloaf.com/blog/swift-optional-protocol-methods/ .이 내용은이 문제에 대한 훌륭한 개요를 제공합니다.


순수한 신속한 작업을 원한다면 가장 좋은 방법은 Swift 형식을 가진 Swift 형식을 반환하는 경우와 같이 기본 구현을 제공하는 것입니다.

예 :

struct magicDatas {
    var damagePoints : Int?
    var manaPoints : Int?
}

protocol magicCastDelegate {
    func castFire() -> magicDatas
    func castIce() -> magicDatas
}

extension magicCastDelegate {
    func castFire() -> magicDatas {
        return magicDatas()
    }

    func castIce() -> magicDatas {
        return magicDatas()
    }
}

다음 모든 기능 을 정의하지 않고 프로토콜을 구현할 수 있습니다.


앙투안의 대답의 메커니즘을 설명하기 위해 :

protocol SomeProtocol {
    func aMethod()
}

extension SomeProtocol {
    func aMethod() {
        print("extensionImplementation")
    }
}

class protocolImplementingObject: SomeProtocol {

}

class protocolImplementingMethodOverridingObject: SomeProtocol {
    func aMethod() {
        print("classImplementation")
    }
}

let noOverride = protocolImplementingObject()
let override = protocolImplementingMethodOverridingObject()

noOverride.aMethod() //prints "extensionImplementation"
override.aMethod() //prints "classImplementation"

원래 질문에서 약간 주제를 벗어나지 만, 앙투안의 아이디어를 쌓아서 누군가에게 도움이 될 것이라고 생각했습니다.

프로토콜 확장을 사용하는 struct에 대해 계산 속성을 선택적으로 만들 수도 있습니다.

프로토콜의 속성을 선택적으로 만들 수 있습니다.

protocol SomeProtocol {
    var required: String { get }
    var optional: String? { get }
}

프로토콜 확장에 더미 계산 된 속성 구현

extension SomeProtocol {
    var optional: String? { return nil }
}

이제 선택적 속성을 구현했거나 가지지 않은 struct를 사용할 수 있습니다.

struct ConformsWithoutOptional {
    let required: String
}

struct ConformsWithOptional {
    let required: String
    let optional: String?
}

나는 또한 Swift 2 릴리스를 통해 변경 될 경우에 대비 하여 필자의 블로그에서 Swift 프로토콜의 옵션 속성 을 수행하는 방법을 썼습니다.


Optional Protocol 을 신속하게 정의하려면 Protocol 내에서 Protocol 선언 및 attribute / method 선언 앞에 @objc 키워드를 사용해야합니다. 다음은 프로토콜의 Optional Property 샘플입니다.

@objc protocol Protocol {

  @objc optional var name:String?

}

class MyClass: Protocol {

   // No error

}

다음은 위임 패턴의 구체적인 예입니다.

프로토콜 설정 :

@objc protocol MyProtocol:class
{
    func requiredMethod()
    optional func optionalMethod()
}

class MyClass: NSObject
{
    weak var delegate:MyProtocol?

    func callDelegate()
    {
        delegate?.requiredMethod()
        delegate?.optionalMethod?()
    }
}

대리자를 클래스로 설정하고 프로토콜을 구현합니다. 옵션의 메소드를 구현할 필요는없는 것을 확인해주세요.

class AnotherClass: NSObject, MyProtocol
{
    init()
    {
        super.init()

        let myInstance = MyClass()
        myInstance.delegate = self
    }

    func requiredMethod()
    {
    }
}

한 가지 중요한 점은 선택적인 방법은 선택적이며 "?" 전화 할 때. 두 번째 물음표를 언급하십시오.

delegate?.optionalMethod?()

스위프트 3.0

@objc protocol CounterDataSource {
    @objc optional func increment(forCount count: Int) -> Int
    @objc optional var fixedIncrement: Int { get }
}

그것은 당신의 시간을 절약 할 것입니다.


선택적 메소드를 사용하려면 @objc 속성으로 프로토콜을 표시 해야 합니다.

@objc protocol MyProtocol {

    @objc optional func doSomething()

}

class MyClass : MyProtocol {

    // no error

}

그렇지 않으면 Swift 프로토콜은 인터페이스에 정의 된 모든 메소드를 구현해야하는 다른 OO 언어의 인터페이스처럼 작동합니다.





swift-extensions