Aray와 Dictionary에도 트렌디한 extension이 설치되어 있습니다.

전언


RxSwift, Kingfisher, 그리고 자신의 Danbo 등 총서에서 사용된 .ex에서 확장extension의 실시 방법, 방법여기 기사.여기 기사.의 상세한 실시 방법을 명확하게 구분하였다.이런 방법 중에는 ArrayDictionary 등 자신의 하위형 속박이 있는 유형에 직접 적용할 수 없다.그림where Base == Array을 그리면 컴파일러에게 욕을 먹는다.
계속어제의 투고어떻게든 쓰고 싶다Eltaso[1, 2, 3].eltaso.random라는 작법은 어제 천신만고 끝에 무사히 성공했고 방법을 공유하면서 보라를 기다리고 있다.

목표


한 마디로 하면 이 글에서 보다 보편적인 문법을 공유하고 싶어서 위의 것과는 조금 다르다[1, 2, 3].ex.random를 목표로 삼고 싶습니다.

미리 준비하다


대체로여기 기사.에 바탕을 둔 것이기 때문에 그쪽 기사를 보면서 이 글을 읽으면 이해하기 쉬울 것 같다.또한 가능하다면 이 설치 방법을 먼저 기억하는 것이 좋다Array.

이루어지다


ExampleCompatible.swift
public protocol ExampleCompatible {
    associatedtype CompatibleType
    var ex: CompatibleType { get }
}

public struct Example<Base> {
    let base: Base
}

public struct ExampleWithSingleAssociatedType<Base, AssociatedType> {
    let base: Base
}
Array.swift
extension Array: ExampleCompatible {
    public var ex: ExampleWithSingleAssociatedType<Array<Element>, Element> {
        return ExampleWithSingleAssociatedType(base: self)
    }
}

extension ExampleWithSingleAssociatedType where Base == Array<AssociatedType> {
    public var random: AssociatedType? {
        guard !self.base.isEmpty else {
            return nil
        }
        let index = Int(arc4random_uniform(UInt32(self.base.count)))
        return self.base[index]
    }
}
Playground.swift
[1, 2, 3].ex.random // 2

해설


ExampleCompatible.swift


우선 ExampleCompatible 부분에 대해 알고 있는 바와 같이 Example<Base> 외에 ExampleWithSingleAssociatedType<Base, AssociatedType>라는 새로운 부분을 추가했다.일반Example과 달리 여기BaseAssociatedType 두 가지 유형의 속박이 있다.이외에도 Example와 동일
또 여기서 특별히 ExampleCompatibleextension를 삭제했다.Array진입ExampleWithSingleAssociatedType이지만 통상적인 유형진입Example이기 때문에 extension ExampleCompatible에서 직접 정의ex하면 물품에 따라 다른 유형ex으로 되돌아갈 수 있기 때문에 아래Array.swift부분과 같이 직접형 확장에 정의한다.

Array.swift


다음은 Array.swift에서 먼저 확장Array을 적용ExampleCompatible한다.이것은 일반적인 유형의 확장을 만들 때와 같다.그러나 여기에는 직접ex의 반환 값을 정의해야 한다.되돌아오는 값의 유형은 보십시오 ExampleWithSingleAssociatedType<Array<Element>, Element>.즉 ExampleWithSingleAssociatedTypeBaseArray<Element>,AssociatedTypeArray.Element이다.
여기에 정의할 수 있다면, 그 다음은 일반 형식 Example 의 확장과 같이, 확장 ExampleWithSingleAssociatedType 이다.제한은 Base == Array<AssociatedType>입니다.
확장에서 random: AssociatedType? 속성을 정의합니다.내용은 자신의 무작위 요소만 간단하게 되돌려준다(단 빈 배열에서 되돌려준다nil.

Playground.swift


이를 할 수 있다면Playground 열기[1, 2, 3].ex.random, 자동1, 2, 3에서 명령을 사용하여 무작위 수를 되돌릴 수 있다.맞죠?간단하죠?

Aray 이외에 적용


상기ExampleWithSingleAssociatedType의 정의를 보면 BaseAssociatedType 두 가지 유형의 속박이 있기 때문에 Array뿐만 아니라 자신에게 하위적인 속박이 있는 유형도 기본적으로 적용될 수 있다.예를 들면 Range<Bound> 같은 거요.작법은 Array.swift 내용의 ArrayRange, Element로 간단하게 고쳐 쓰면 된다.
그렇다면 두 개의 하위형 속박이 있는 것, 예를 들면 Bound을 어떻게 하면 좋을지 말하자면 이것도 매우 간단하다. 방금 추가Dictionary<Key, Value>한 것과 같이 다른 것ExampleWithSingleAssociatedType<Base, AssociatedType>ExampleWithDualAssociatedType<Base, AssociatedType1, AssociatedType2>을 정의하고 struct갚은 것Dictionaryex을 쓰면 된다.뭐, 형식적 구속이 증가하면 쓰기에 게으르겠네 w

잡담


상술한 것은 일반인을 향한 것이다(?)자신의 이름EltasoExampleWithDualAssociatedType<Dictionary<Key, Value>, Key, Value>이 아니라 Example로 명명되었고 확장은 EltasoContainer의 이름이다.가까스로 이름 충돌을 피하기 위해 이런 문법을 도입했지만 같은 문법의 총서eltaso를 도입해 이름이 충돌하면 쉽지 않다.따라서 여러분은 스스로 이 맞춤법을 도입할 때 ex 대신 다른 이름으로 쓰는 것이 비교적 안전하다고 생각합니다.
참고로 이 확장 방법은 엘타소의 4.0에서 공개될 예정이지만 이 버전에서는 이 외에도 방법체인에 대한 대응조치가 실시될 예정이다(큰 실용성은 말할 것도 없다).업무량이 상당히 많아서 4.1이면 실현될 수 있을지도 모르지만 현재의 대응 상황을 먼저 살펴보면 바로 이런 느낌입니다.

연기도 생각보다 나쁘지 않았다.

나의 애인

좋은 웹페이지 즐겨찾기