Làm cách nào để thay đổi cách biểu diễn văn bản được hiển thị cho một kiểu trong Swift?


91

Làm cách nào để sửa đổi kết quả đầu ra dạng văn bản được hiển thị trong nội suy chuỗi?

Các Printablegiao thức trông rõ ràng nhất nhưng nó bỏ qua trong cả chuỗi suy và khi in Ví dụ, ví dụ như:

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

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

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

Tương tự như vậy, toString()quy ước cũng không có hiệu lực:

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)

Hành vi lại khác trong PlayGround sử dụng biểu diễn Chuỗi của riêng nó cho cấu trúc, tức là:

p // {x 10, y 20}

Có cách nào tôi có thể thay đổi cách hiển thị một phiên bản không?


Đoạn mã trên hoạt động như mong đợi trong Playgrounds trong Xcode 6.3 beta 4
carbo18

Câu trả lời:


112

Swift 2 - 4

Tóm lược

Tuân theo CustomStringConvertiblegiao thức và thêm description:

var description: String {
    return "description here"
}

Thí dụ

Bạn có thể tạo một số cấu trúc:

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)."
    }
}

Nếu bạn khởi tạo chúng:

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])

Các mô tả tùy chỉnh sẽ xuất hiện trong sân chơi của bạn:

nhập mô tả hình ảnh ở đây

Xem thêm CustomDebugStringConvertible, bạn có thể sử dụng cái này để có đầu ra dài dòng hơn trong quá trình gỡ lỗi.


Chú thích sử dụng

Bạn có thể khởi tạo một Stringtừ bất kỳ loại nào mà không cần triển khai giao thức này. Ví dụ:

nhập mô tả hình ảnh ở đây

Vì lý do này, tài liệu nói:

Do đó, không khuyến khích sử dụng CustomStringConvertiblenhư một ràng buộc chung hoặc truy cập trực tiếp vào một kiểu phù hợp description.


37

Tài liệu Apple Swift có liên quan

Apple cung cấp ví dụ này:

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

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

Nếu bạn thử điều này trong sân chơi, bạn sẽ gặp phải vấn đề giống như bạn đang gặp phải ( V11lldb_expr...). Trong sân chơi, bạn nhận được mô tả ở phía bên phải khi bạn gọi trình khởi tạo, nhưng mô tả printlnkhông trả về nội dung dễ đọc.

Tuy nhiên, ngoài sân chơi, mã này hoạt động như bạn mong đợi. Cả mã của bạn và mã mẫu từ Apple ở trên đều in đúng descriptionkhi được sử dụng trong ngữ cảnh không phải sân chơi.

Tôi không nghĩ rằng bạn có thể thay đổi hành vi này trong sân chơi. Nó cũng có thể chỉ là một lỗi.

CHỈNH SỬA : Tôi khá chắc rằng đây là một lỗi; Tôi đã gửi báo cáo lỗi cho Apple.

CẬP NHẬT : Trong Swift 2, thay vì Printablesử dụng CustomStringConvertible( liên kết tài liệu có liên quan ).

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

Đây dường như là một lỗi trong sân chơi. Nếu bạn thực sự biên dịch và chạy chương trình bình thường, nó sẽ in:

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

như mong đợi.

Bạn nên báo cáo điều này tại https://bugreport.apple.com


0

Nếu bạn mở giao diện bảng điều khiển: View -> Assistant Editor -> Show Assistant Editor, bạn có thể thấy các dòng in dự kiến ​​Đã kiểm tra trong xCode 6.3.2 với Yosimite 10.10

nhập mô tả hình ảnh ở đây


0

Để thay thế trong Swift 5+, bạn có thể mở rộng String.StringInterpolation

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

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

Điều này sẽ thay đổi giá trị cho print("\(p)") nhưng không cho print(p)- sẽ vẫn sử dụng mô tả


0

AppCodecung cấp một Generate| debugDescriptionvà `` Tạo | mô tả`. Beats gõ chúng ra cho một cấu trúc có nhiều thành viên.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.