Swift에서 유형에 대해 표시되는 텍스트 표현을 어떻게 변경할 수 있습니까?


91

문자열 보간에 표시되는 텍스트 출력을 어떻게 수정할 수 있습니까?

Printable프로토콜은 가장 명백한 보이지만 모두 문자열 보간 무시하고 있어요 인스턴스를 인쇄 할 때, 예를 들면 :

struct Point : Printable
{
    var x = 0
    var y = 0

    var description : String {
        return "(\(x), \(y))"
    }

    func toString() -> String {
        return description
    }
}

마찬가지로이 toString()규칙은 효과가 없습니다.

var p = Point(x: 10, y: 20)

println(p)                   // V11lldb_expr_05Point (has 2 children)
println("\(p)")              // V11lldb_expr_05Point (has 2 children)
println(p.description)       // (10, 20)
println("\(p.description)")  // (10, 20)

동작은 구조체에 대해 자체 문자열 표현을 사용하는 PlayGround에서 다시 다릅니다.

p // {x 10, y 20}

인스턴스 표시 방법을 변경할 수있는 방법이 있습니까?


위의 코드는 Xcode 6.3 베타 4의 플레이 그라운드에서 예상대로 작동합니다
carbo18 2015

답변:


112

스위프트 2-4

요약

CustomStringConvertible프로토콜을 준수하고 다음 을 추가하십시오 description.

var description: String {
    return "description here"
}

몇 가지 구조체를 만들 수 있습니다.

struct Animal : CustomStringConvertible {
    let type : String

    var description: String {
        return type
    }
}

struct Farm : CustomStringConvertible {
    let name : String
    let animals : [Animal]

    var description: String {
        return "\(name) is a \(self.dynamicType) with \(animals.count) animal(s)."
    }
}

초기화하는 경우 :

let oldMajor = Animal(type: "Pig")
let boxer = Animal(type: "Horse")
let muriel = Animal(type: "Goat")

let orwellsFarm = Farm(name: "Animal Farm", animals: [oldMajor, boxer, muriel])

사용자 지정 설명이 플레이 그라운드에 나타납니다.

여기에 이미지 설명 입력

CustomDebugStringConvertible디버깅 중에 더 자세한 출력을 위해 사용할 수있는을 참조하십시오 .


사용법 참고

이 프로토콜 구현 하지 않고도String 모든 유형 에서을 초기화 할 수 있습니다 . 예를 들면 :

여기에 이미지 설명 입력

이러한 이유로 문서는 다음과 같이 말합니다.

사용하여 CustomStringConvertible일반적인 제약 조건으로, 또는 준수 유형에 접근하는 것 description직접 따라서 좋습니다.


37

관련 Apple Swift 문서

Apple은 다음 예를 제공합니다.

struct MyType: Printable {
    var name = "Untitled"
    var description: String {
        return "MyType: \(name)"
    }
}

let value = MyType()
println("Created a \(value)")
// prints "Created a MyType: Untitled"

Playground에서 이것을 시도하면 ( V11lldb_expr...) 와 동일한 문제가 발생합니다 . 놀이터에서 이니셜 라이저를 호출하면 오른쪽에 설명이 표시되지만 println가독성이있는 것을 반환하지 않습니다.

그러나 놀이터 밖에서는이 코드가 예상대로 작동합니다. 위의 Apple에서 제공 한 코드와 샘플 코드는 모두 description플레이 그라운드가 아닌 컨텍스트에서 사용할 때 올바르게 인쇄 됩니다.

놀이터에서이 행동을 바꿀 수 없다고 생각합니다. 버그 일 수도 있습니다.

편집 : 나는 이것이 버그라고 확신합니다. Apple에 버그 보고서를 제출했습니다.

UPDATE : 대신 스위프트 2에서 Printable사용 CustomStringConvertible( 관련 문서 링크 ).

struct MyType: CustomStringConvertible {
    var name = "Untitled"
    var description: String {
        return "MyType: \(name)"
    }
}

let value = MyType()
println("Created a \(value)")
// prints "Created a MyType: Untitled"

2

이것은 놀이터의 버그로 보입니다. 실제로 프로그램을 정상적으로 컴파일하고 실행하면 다음과 같이 인쇄됩니다.

(10, 20)
(10, 20)
(10, 20)
(10, 20)

예상대로.

https://bugreport.apple.com 에서이를보고해야합니다.


0

콘솔보기를 열면 : View-> Assistant Editor-> Show Assistant Editor 당신은 Yosimite 10.10과 함께 xCode 6.3.2에서 체크 된 예상 인쇄 라인을 볼 수 있습니다.

여기에 이미지 설명 입력


0

Swift 5+의 대안으로 String.StringInterpolation을 확장 할 수 있습니다.

struct Point {
    var x : Int
    var y : Int
}

extension String.StringInterpolation {
    mutating func appendInterpolation(_ value: Point) {
        appendInterpolation("\(value.x):\(value.y)")
    }
}

이 값을 변경합니다 print("\(p)") 하지만, 하지 에 대해 print(p)- 아직 설명을 사용하는


0

AppCode제공 Generate| debugDescription하고``생성 | 설명`. 많은 구성원이있는 구조체에 대해 입력하는 것보다 낫습니다.

여기에 이미지 설명 입력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.