2014-09-12 25 views
12

Tôi phải thực hiện giao thức nào để kiểm soát cách đối tượng được biểu diễn trong một nội suy chuỗi trong Swift?Giao thức Swift cho nội suy chuỗi

tôi wan't để xác định những gì được được in trong một cái gì đó như thế này:

struct A{ 

} 

var a = A() 
println("\(a)") 

Trả lời

23

Bạn cần phải thực hiện các giao thức Printable:

giao thức này nên được áp dụng theo loại có nhu cầu tùy chỉnh hiển thị văn bản của họ. Biểu diễn văn bản này được sử dụng khi các đối tượng được ghi vào một số OutputStreamType.

protocol Printable { 
    var description: String { get } 
} 

Ngoài ra còn có các giao thức DebugPrintable khi nó chỉ dành cho mục đích gỡ lỗi:

giao thức này nên được áp dụng theo loại có nhu cầu tùy chỉnh đại diện văn bản của họ sử dụng cho mục đích gỡ lỗi. Biểu mẫu văn bản này được sử dụng khi đối tượng được ghi vào một số OutputStreamType.

protocol DebugPrintable { 
    var debugDescription: String { get } 
} 

Documentation (Cảm ơn @MartinR)

Lưu ý: Như @Antonio và @MartinR đề cập trong các ý kiến, điều này không làm việc ở sân chơi (như của Xcode6 GM anyway) ; đó là một lỗi đã biết. Nó hoạt động trong các ứng dụng được biên dịch.

Từ Xcode6 GM Ghi chú Phát hành:

Trong sân chơi, println() bỏ qua sự phù hợp có thể in của kiểu do người dùng định nghĩa. (16562388)

Kể từ Swift 2.0 Printable hiện đã trở thành CustomStringConvertible. Mọi thứ vẫn giữ nguyên như trước đây, bạn vẫn cần triển khai

var description: String { get } 

Nhưng giờ đây được gọi là CustomStringConvertible. Và gỡ lỗi là CustomDebugStringConvertible

+1

Bạn có chắc chắn điều này không? Test'. Bất kể 'Printable' có được triển khai hay không là – Antonio

+1

Cũng được ghi lại ở đây: https://developer.apple.com/library/prerelease/ios/documentation/General/Reference/SwiftStandardLibr aryReference/Printing.html. –

+1

Thú vị. Nó hoạt động trong một ứng dụng biên soạn, nhưng không phải trong một sân chơi. –

1

Tôi muốn đặt một giải pháp thay thế ở đây:

Giao thức cho chuỗi suy trong Swift là StringInterpolationConvertible. Đó là, bất kỳ lớp nào thực hiện giao thức, có thể được xây dựng từ một nội suy chuỗi.

Quay lại câu hỏi, để kiểm soát nội dung được in ra cho nội suy chuỗi ký tự của các thể hiện của lớp A, bạn cần phải tạo một tiện ích mở rộng chuỗi và quá tải hàm init(stringInterpolationSegment expr: A).

extension String { 
    init(stringInterpolationSegment expr: A) { 
     //do custom work here 
     //for example: self.init(expr.description) 
    } 
} 

Trong trường hợp bạn đang tìm kiếm cách xóa "gây khó chịu" Tùy chọn (...)" Khi suy biến bắt buộc, mà tôi nghĩ là lý do chính tại sao mọi người lại muốn kiểm soát cách một đối tượng được in ra, chỉ cần có một cái nhìn tại pod NoOptionalInterpolation here

thông tin bổ sung (chỉnh sửa):. Xác nhận rằng trọng description sẽ chỉ hoạt động cho cấu trúc/lớp học của riêng bạn, nhưng không phải cho cấu trúc/lớp học hiện có, chẳng hạn như IntOptional

Các vấn đề liên quan