2017-12-14 13 views
1

수퍼 클래스에서 구현되는 메서드에서 내 개체의 동적 형식을 결정해야합니다. 수퍼 클래스는 BaseClient이며 DisplayClient는이 클래스로부터 상속받습니다.스위프트 4 : 형식 (of : self) .description()은 String과 다릅니다 (설명 : 형식 (of : self))

패키지 이름이 아니라 클래스 이름 만 있으면됩니다.

print("1", String(describing: type(of: self))) // DisplayClient 
print("2", type(of: self))      // DisplayClient 
print("3", type(of: self).description())  // package.DisplayClient 
print("4", "\(type(of: self))")    // DisplayClient 

type(of: self).description() 

반환 package.DisplayClient 다른 사람은 클래스 이름을 반환 않지만 : 이것은 내가 뭘하려? String을 사용할 때 내부적으로 무엇이 호출되는지 궁금합니다. (type : of : self)). 나는 이것이 내가하는 일을 정확하게 수행한다고 가정 할 것이다.

문자열이 내부적으로 생성되는 방법에 대한 자세한 정보는 어디에서 찾을 수 있습니까?

docs 말 :

사용이 초기화가 문자열 인스턴스로 선호 표현으로 모든 유형의 인스턴스를 변환 할 수 있습니다. 인스턴스가 TextOutputStreamable 프로토콜을 준수하는 경우, 결과가 (에 : S) instance.write를 호출하여 얻을 수있다

  • :의 초기화는 프로토콜의 적합성에 따라 다음 중 한 가지 방법으로 인스턴스의 캐릭터 라인 표현을 생성 빈 문자열 s.
  • 인스턴스가 CustomStringConvertible 프로토콜을 준수하면 결과는 instance.description입니다.
  • 인스턴스가 CustomDebugStringConvertible 프로토콜을 준수하면 결과는 instance.debugDescription입니다.
  • 지정되지 않은 결과는 Swift 표준 라이브러리에 의해 자동으로 제공됩니다.

그러나 유형 (of : self)에는 설명 속성도 없습니다. 그것은 단지 description() 메소드를 가지고있다. 이것은 컴파일러에 의해 다르게 처리되는 특별한 경우입니까? 클래스가 NSObject에서 상속하는 경우

+0

관련 : https://stackoverflow.com/questions/48306011/swift-4-typeof-self-differs-when-using-private-fileprivate –

답변

2

type(of: self).description()NSObject.description() class method 호출 :이 방법의

class func description() -> String 

NSObject의의 구현은 클래스의 이름을 인쇄합니다.

이며 모듈 이름을 포함하는지 여부는 문서화되어 있지 않습니다. 클래스가 NSObject에서 상속되지 않는 경우 기본값 인 description() 메서드가 없습니다.한편

,

print(String(describing: type(of: self))) // DisplayClient 
print(type(of: self))      // DisplayClient 

모두 규정되지 않은 유형 이름을 인쇄하고

print(String(reflecting: type(of: self))) // package.DisplayClient 
debugPrint(type(of: self))    // package.DisplayClient 

모두

는 정규화 된 형식 이름이 How to get a Swift type name as a string with its namespace (or framework name) 비교 인쇄하고 Xcode 7 Release Notes :

유형 이름 및 열거 형 사례 n ow는 기본적으로 자격없이 인쇄하고 String으로 변환합니다. debugPrint 또는 String(reflecting:)은 여전히 ​​ 일 수 있습니다.

+0

I는 문자열을 사용 (설명 : 유형 (중 : 자기)) 지금 그것은 나를 위해 작동합니다. 유일한 문제는 public이 아닌 클래스에 대한 몇 가지 추가 정보를 반환한다는 것입니다. 예 : 파일 개인 클래스 InitialState에 대해 "(InitialState in _AF5C6D4A3B423A6F0735A7740F802E5A)"이 리턴됩니다. 하지만 내 콘솔 출력 (로깅)에 대해서만이 정보를 사용하므로 큰 문제는 없습니다. 클래스를 public으로 변경하면 예상대로 예상대로 "InitialState"만 반환됩니다. –

+0

: https://stackoverflow.com/ 질문/48306011/swift-4-typeof-self-differences-using-private-fileprivate –