SomeClass와whereT=SomeClass의 상호보완적 차이&원인

6306 단어 Swift

TL;DR


아래 그림을 보십시오

.

네, 사용:한 경우 제약을 충족시키지 못하면 보완 목록에 나타나지 않지만, 사용==할 때 제한을 충족시키지 않아도 보완 목록에 나타납니다(당연히 컴파일 오류).이유가 불분명하다.여색을 좋아하는 사람에게 알려주세요.

자세한 말


확장은 Swift에서 매우 자주 사용하는 기능 중 하나로 특정한 상황을 확장하고자 한다. 예를 들어 ArrayElementString만 사용할 때joined(separator: String) -> String 기능은 이렇게 정의된다.
extension Array where Element == String {
    public func joined(separator: String = default) -> String
}
위에서 말한 바와 같이 스위프트는 extension의 뒤에 where A == B와 같은 제약을 붙일 수 있지만 where의 문법에서 ==를 사용했고 다른 것도 사용할 수 있다:.보기에는 같지만 의미는 미묘하게 다르다.==는 "B", :는 "B"이라고 밝혔다.
그리고 실제로는 어떤 상황에서도 사용할 수 있는 것이 아니라 사용==만 하고 사용:만 하는 경우도 있다.구체적으로 이런 느낌입니다.B의 유형== : class⭕️
⭕️struct⭕️
protocol
⭕️
보시다시피 ==: 둘 다 사용할 수 있는 것은 Bclass입니다.왜냐면 이런 미묘한 차이가 있죠Bclass인 경우class랑'그것class'이랑'그것struct은 자류일 때랑 차이가 있지만 struct상속 개념이 없어서'그것protocol'일 때만 있는 거예요.반대로 protocol라면 protocol 자체가 특정한 유형이 아니기 때문에 정형화할 필요가 있기 때문에'그것class'은 의미가 없다.
참고로 둘 다==를 사용할 수 있는 경우 위와 같이 사용:과 사용protocol을 할 때 동작이 미묘하게 다르다.이것은 extension에 대한 A이고 Self==일 때:
PatternA
protocol Some {}
extension UIView: Some {}
extension Some where Self: UIView {
    func test() { print("works") }
}

UIView().test() //works
UIImageView().test() //works
PatternB
protocol Some {}
extension UIView: Some {}
extension Some where Self == UIView {
    func test() { print("test") }
}

UIView().test() //works
UIImageView().test() //error: 'UIImageView' is not convertible to 'UIView'
이런 이유는 이해하기 쉽다.그리고であるUIImageView가 아니라UIView를 물려받았다.그래서 UIView를 쓰면 : 정상인데 test()를 쓰면 == 잘못된 거예요.
하지만 test()라면 왠지extension Array where Element == SomeClass의 자류도 통과할 것으로 보인다.기가 막힌 것 같아요.🤔
하지만 이것도 마음에 든다. 오늘 가장 마음에 드는 것은 역시 TL이다.DR에 적힌 보완 문제입니다.왜 SomeClass 쓰면 보전은 정확한 것에만 나타나는지: 쓰면 적합하지 않아도 보전이 나타납니다.분명히 컴파일 오류였어.
그나저나 왜 이런 행동을 눈여겨봤을까? 오토 라우트NotAutoLayout를 죽이는 오토 라우트의 틀에서 벗어나 안쪽에서 제작이렇게==하는 타입의 Phantom Type 행동으로 특정 상황에서 특정 조력자 방법을 만들고 싶었다.웬일인지 보완 리스트에는 여건이 맞지 않는 방법들이 다수 등장했고, 매우 불친절하게 느껴지지 않도록 결국 무리LayoutMaker 타입을 많이 만들었다.그나저나 오늘은 Phantom Type여기 기사가 있어요.에 대해 읽고 "아, 근데 XxxLayoutMaker 처음부터 보완 리스트에 나왔구나"라고 생각하며 플레이그라운드에서 소스 코드를 복사한 뒤 나오지 않았다!"응?"이렇게 여러 번 시도해 보았는데 그 기사에서 사용.shout()되었기 때문에 보충 리스트가 정확하게 운행되었다.
단, 위 표에 적힌 대로 사용:하면 원래struct할 수 없기 때문에 사용:해야 하지 않을까... 단, 제작class하면class생성원가비final가 높아서 별로 쓰고 싶지 않은 느낌...무한정 증가struct할 수밖에 없죠(흰눈

좋은 웹페이지 즐겨찾기