SomeClass와whereT=SomeClass의 상호보완적 차이&원인
6306 단어 Swift
TL;DR
아래 그림을 보십시오
.
네, 사용:
한 경우 제약을 충족시키지 못하면 보완 목록에 나타나지 않지만, 사용==
할 때 제한을 충족시키지 않아도 보완 목록에 나타납니다(당연히 컴파일 오류).이유가 불분명하다.여색을 좋아하는 사람에게 알려주세요.
자세한 말
확장은 Swift에서 매우 자주 사용하는 기능 중 하나로 특정한 상황을 확장하고자 한다. 예를 들어 Array
의Element
는 String
만 사용할 때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
❌
⭕️
보시다시피 ==
와 :
둘 다 사용할 수 있는 것은 B
만class
입니다.왜냐면 이런 미묘한 차이가 있죠B
는class
인 경우class
랑'그것class
'이랑'그것struct
은 자류일 때랑 차이가 있지만 struct
상속 개념이 없어서'그것protocol
'일 때만 있는 거예요.반대로 protocol
라면 protocol
자체가 특정한 유형이 아니기 때문에 정형화할 필요가 있기 때문에'그것class
'은 의미가 없다.
참고로 둘 다==
를 사용할 수 있는 경우 위와 같이 사용:
과 사용protocol
을 할 때 동작이 미묘하게 다르다.이것은 extension
에 대한 A
이고 Self
가 ==
일 때:
PatternAprotocol Some {}
extension UIView: Some {}
extension Some where Self: UIView {
func test() { print("works") }
}
UIView().test() //works
UIImageView().test() //works
PatternBprotocol 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
할 수밖에 없죠(흰눈
Reference
이 문제에 관하여(SomeClass와whereT=SomeClass의 상호보완적 차이&원인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/lovee/items/b4c2a064e475a496f04c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
확장은 Swift에서 매우 자주 사용하는 기능 중 하나로 특정한 상황을 확장하고자 한다. 예를 들어
Array
의Element
는 String
만 사용할 때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
❌⭕️
보시다시피
==
와 :
둘 다 사용할 수 있는 것은 B
만class
입니다.왜냐면 이런 미묘한 차이가 있죠B
는class
인 경우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
PatternBprotocol 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
할 수밖에 없죠(흰눈
Reference
이 문제에 관하여(SomeClass와whereT=SomeClass의 상호보완적 차이&원인), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/lovee/items/b4c2a064e475a496f04c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)