Câu trả lời ngắn gọn: bạn không thể. Tóm tắt KeyPath
được thiết kế để đóng gói một đường dẫn khóa có khả năng lồng nhau từ một loại gốc đã cho. Do đó, việc xuất một giá trị String
đơn lẻ có thể không có ý nghĩa trong trường hợp chung. Ví dụ:
Ví dụ: chuỗi được xuất theo giả thuyết có được hiểu là thuộc tính của loại gốc gốc hoặc là thành viên của một trong các thuộc tính của nó không? Ít nhất một mảng chuỗi cần phải được xuất để xử lý các trường hợp như vậy ...
Mỗi loại workaround. Có nói rằng, vì rằng KeyPath
tuân theo giao thức Equatable
, bạn có thể tự cung cấp giải pháp tùy chỉnh, cho mỗi loại. Ví dụ:
struct Auth {
var email: String
var password: String
}
struct User {
var name: String
var auth: Auth
}
cung cấp một phần mở rộng cho User
con đường quan trọng dựa trên:
extension PartialKeyPath where Root == User {
var stringValue: String {
switch self {
case \User.name: return "name"
case \User.auth: return "auth"
case \User.auth.email: return "auth.email"
case \User.auth.password: return "auth.password"
default: fatalError("Unexpected key path")
}
}
sử dụng:
let name: KeyPath<User, String> = \User.name
let email: KeyPath<User, String> = \User.auth.email
print(name.stringValue) /* name */
print(email.stringValue) /* auth.email */
tôi sẽ không thực sự khuyên giải pháp này cho mã sản xuất, cho việc bảo dưỡng hơi cao, v.v .. Nhưng vì bạn tò mò điều này, ít nhất, cho bạn một con đường phía trước;)
Nguồn
2017-10-04 01:19:57
Rất thú vị! Tôi đã làm một bài kiểm tra nhanh ở đây và, thật không may, có vẻ như thuộc tính '_kvcKeyPathString' đã nói ở trên sẽ * chỉ * trả về giá trị không phải là nil cho các thuộc tính tiếp xúc' @ objc'. Ví dụ, cả hai đường dẫn khóa 'name' và' email', trong câu trả lời của tôi ở trên, được trả về trong 'nil'. –
Lưu ý từ một câu hỏi liên quan: >> * Tuy nhiên, nếu bạn thêm thuộc tính '@ objc' vào thuộc tính thì' _kvcKeyPathString' sẽ thực sự có giá trị thay vì luôn là 'nil'. * << https: // stackoverflow.com/questions/46143292/is-it-possible-to-get-the-kvc-string-from-swift-4-keypath – pkamb