확장을 사용하면 해당 프로토콜을 구현하는 메소드 옆에 프로토콜 준수 선언을 유지할 수 있습니다.
더 확장이 없다면, 귀하의 유형을 선언 상상 :
struct Queue<T> {
// here go the basics of queue - the essential member variables,
// maybe the enqueue and dequeue methods
}
extension SequenceType {
// here go just the specifics of what you need for a sequence type
typealias Generator = GeneratorOf<T>
func generate() -> Generator {
return GeneratorOf {
// etc.
}
}
}
extension Queue: ArrayLiteralConvertible {
init(arrayLiteral elements: T...) {
// etc.
}
}
: 당신이 그것을 구현하는 구체적인 방법과 함께 프로토콜의 구현을 번들 확장을 사용하여
struct Queue<T>: SequenceType, ArrayLiteralConvertible, Equatable, Printable, Deflectable, VariousOtherables {
// lotsa code...
// and here we find the implementation of ArrayLiteralConvertible
/// Create an instance containing `elements`.
init(arrayLiteral elements: T…) {
etc
}
}
명암이
예, 프로토콜 구현을 // MARK
으로 표시 할 수 있습니다 (두 기술을 결합 할 수 있음을 명심하십시오).하지만 프로토콜 지원 선언이 b e 및 파일의 본문 (구현이있는 위치).
또한 프로토콜을 구현하는 경우 구현시 남은 것이 무엇인지 알려주면서 IDE에서 도움이되는 (약간 자세한 내용이있는 경우) 의견을 얻을 수 있습니다. 확장을 사용하여 각 프로토콜을 한 번에 하나씩 수행하면 한 번에 모든 작업을 수행하는 것보다 (나를 위해) 훨씬 쉽게 작업 할 수 있습니다 (또는 작업을 추가 할 때 위에서 아래로 건너 뛰기).
그렇다면 다른 비 프로토콜이지만 관련있는 방법을 확장으로 그룹화하는 것은 자연스러운 일입니다.
나는 실제로 이것을 실망 스럽다. 은이 할 수 없다. 예 :
extension Queue: CollectionType {
// amongst other things, subscript get:
subscript(idx: Index) -> T {
// etc
}
}
// all MutableCollectionType adds is a subscript setter
extension Queue: MutableCollectionType {
// this is not valid - you’re redeclaring subscript(Index)
subscript(idx: Int) -> T {
// and this is not valid - you must declare
// a get when you declare a set
set(val) {
// etc
}
}
}
따라서 동일한 확장자 내에서 두 가지를 구현해야합니다.
선호하는 것을 사용하십시오. 그러나 확장자는 단순히 'MARK :'보다 명확하게 나타내며 시작 지점과 끝 지점을 명확하게 지정합니다. 솔직하게 말하자면, 그것은 MARK :와 확장자를 모두 사용하기 때문에 어느 쪽의 문제도 아닙니다. '확장'의 또 다른 이점은 해당 코드를 쉽게 접을 수 있다는 것입니다 (예 : '편집기'- '코드 접기 ...'- '접기'또는 음영 처리 된 왼쪽 여백에서 클릭). – Rob