Swift tương đương với Java toString ()


Câu trả lời:


122

Tài descriptionsản là những gì bạn đang tìm kiếm. Đây là thuộc tính được truy cập khi bạn in một biến có chứa một đối tượng.

Bạn có thể thêm descriptionvào các lớp của riêng mình bằng cách áp dụng giao thức CustomStringConvertiblevà sau đó triển khai thuộc descriptiontính.

class MyClass: CustomStringConvertible {
    var val = 17

    public var description: String { return "MyClass: \(val)" }
}

let myobj = MyClass()
myobj.val = 12
print(myobj)  // "MyClass: 12"

descriptioncũng được sử dụng khi bạn gọi hàm Stringtạo:

let str = String(myobj)  // str == "MyClass: 12"

Đây là phương pháp được khuyến nghị để truy cập mô tả cá thể (ngược lại với phương thức myobj.descriptionnày sẽ không hoạt động nếu một lớp không triển khai CustomStringConvertible)


Về String(obj)thì sao?
nielsbot

Ngoài ra còn có .debugDescriptionphiên bản thân thiện với lập trình viên hơn
nielsbot

2
nó có áp dụng cho cấu trúc không?
lmiguelvargasf

1
Có, CustomStringConvertible thay thế Printable. @Antonio, tôi không nhớ nó đã thay đổi khi nào, nhưng chắc chắn nó đã có từ rất lâu trước Swift 3.
vacawama

1
MyClass phải được mở rộng từ NSObject
DàChún

7

Nếu có thể sử dụng struct thay vì class thì không cần làm gì thêm.

struct chỉ tự in đẹp ra đầu ra

print("\(yourStructInstance)")

hoặc với lớp học như thế này:

print(String(describing: yourClassInstance))

6

Bạn nên sử dụng String(obj).

Trực tiếp từ tài liệu cho CustomStringConvertible :

GHI CHÚ

Chuỗi (cá thể) sẽ hoạt động đối với một thể hiện thuộc loại bất kỳ, trả về mô tả của nó nếu thể hiện đó là CustomStringConvertible. Do đó, không khuyến khích sử dụng CustomStringConvertible như một ràng buộc chung hoặc truy cập trực tiếp vào mô tả của loại phù hợp.


Có vẻ như description()phương pháp của CustomStringConvertiblesẽ là đủ.
Greg Brown

5

Cách thực hiện với NSObjectcác lớp mở rộng

Nếu lớp mô hình của bạn được mở rộng từ NSObject, bạn phải ghi đè Biến descriptionnhư sau:

public override var description: String {
    return "\n{\n index: \(self.index),\n"
        + " country: \(self.name),\n"
        + " isoCountryCode: \(self.isoCountryCode),\n"
        + " localeId: \(self.localeId),\n"
        + " flagImageName: \(self.flagImageName!)\n}"
}

Bạn có thể kiểm tra cách tôi đã thực hiện tại đây trong Countrylớp học , trong "thư viện CountryPicker iOS Swift" .

Hoặc, để bạn dễ hiểu hơn, lớp và descriptionphương thức của bạn sẽ giống như sau:

public class MyClass: NSObject {
   public var memberAttribute = "I'm an attribute"

   public override var description: String {
       return "My Class member: \(self.memberAttribute)"
   }
}

Lưu ý: Vì bạn đang mở rộng lớp Modal của mình nên lớp NSObjectnày không yêu cầu lớp của bạn phải tuân thủ CustomStringConvertiblelớp nữa và bạn đang ghi đè descriptionbiến từ NSObjectchính lớp đó. Hãy luôn nhớ rằng, CustomStringConvertiblephần lớn là cách Swift thuần túy để đạt được điều nà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.