>

다음 코드가 있습니다. 마지막 줄에서 오류를 어떻게 해결할 수 있습니까?

protocol Animal {
    func walk()
}
struct Cat: Animal {
    func walk() {}
    init() { }
}
var obj: Any = Cat()
var cat = obj as Animal // ERROR: cannot downcast from Any to unrelated type Animal

  • 답변 # 1

    업데이트 :Swift 1.2 이상 (Xcode 6.3+)에서 수정되었습니다. Xcode 6.3 베타 릴리스 노트는 다음과 같이 말합니다.

    와이즈 비즈 <시간>

    프로토콜 적합성 만 확인할 수 있습니다 (

    Dynamic casts (“as!", “as?" and “is”) now work with Swift protocol types, so long as they have no associated types.

    포함) isas )와 as?  프로토콜. 와이즈 비즈   @objc 가 아닙니다 .

    Swift 책의 프로토콜 적합성 확인 섹션을 참조하십시오.

    와이즈 비즈

  • 답변 # 2

    다음을 수행하여 해결할 수 있습니다

    Animal
    
    

    그러나이 해결 방법은 거의 쓸모가 없습니다. @objc 의 유형을 알아야하기 때문입니다.  먼저

    <시간>

    수정 :

    @newacct가 지적했듯이 버그가 아닙니다. 자세한 내용은 답변을 참조하십시오.

    NOTE

    You can check for protocol conformance only if your protocol is marked with the @objc attribute

    var cat = obj as Cat as Animal  프로토콜은 obj 필요  속성과 xcrun swift Welcome to Swift! Type :help for assistance. 1> 2> @objc protocol Animal { 3. func walk() 4. } @objc class Cat: Animal { func walk() {} init() { } } var obj: AnyObject = Cat() var cat = obj as Animal 5> 6> @objc class Cat: Animal { 7. func walk() {} 8. 9. init() { } 10. } 11> 12> var obj: AnyObject = Cat() obj: Cat = {} 13> 14> var cat = obj as Animal cat: Cat = {} 15>   Animal 해야합니다 .

  • 답변 # 3

    내 접근 방식

    @objc
    
    

  • 답변 # 4

    관찰 할 수있는 한 Cat  클래스 유형 (†) 및 @objc class 인스턴스에만다운 캐스트가능  유형 (클래스 또는 기타)으로 만다운 캐스트일 수 있으며 프로토콜로캐스트할 수 없습니다. .

    이 버그를 버그로 인정할지 여부는 알 수 없습니다.이 경우 좋은 이유 때문에이 방법으로 구현되었지만 @Bryan의 해결 방법 (먼저 유형으로 캐스팅 한 다음 프로토콜로 캐스팅) 적어도 "오류를 해결하십시오"!

    (†) 주목할만한 예외는 AnyObject에서 Int, String 등의 핵심 데이터 유형으로 다운 캐스트 할 수 있다는 것입니다.

    @objc protocol Animal { func walk() } @objc class DummyAnimal: Animal { func walk() { } } @objc class Cat: DummyAnimal { override func walk() { print("meow") } override init() { } } var obj: Any = Cat() var cat = obj as DummyAnimal cat.walk()

  • 이전 iphone - dateFromString은 항상 dateformatter와 함께 null을 반환합니다
  • 다음 jquery - 자바 스크립트로 CSS 스타일 시트 새로 고침