Đây là một trong nhiều thông báo lỗi khó hiểu của Swift. Theo như tôi có thể nói bởi vì phía bên trái và bên phải không phù hợp (Optional<String>
vs String
), đoán tốt nhất của nó là bạn có nghĩa là cho cả hai bên là UInt8
.
Để vượt qua sự thật rằng UILabel.text
là tùy chọn, bạn có thể làm mọi thứ theo cách dài:
actionLabel.text = (actionLabel.text ?? "") + "\(action.name) |"
này nhận được giá trị hiện tại hoặc một chuỗi trống và gắn thêm các văn bản. Bạn cũng có thể tránh được những vấn đề về mặt chức năng:
actionLabel.text = join(" | ", map(actions, { $0.name }))
Cập nhật
Liên quan đến giải pháp lặp đi lặp lại có thêm một |
vào cuối trong "", tôi đã cố gắng để minh họa cho giải pháp đối với dòng gây ra lỗi. Mã đã đăng của bạn cũng đưa ra các giả định về actionLabel ban đầu bị trống và có một số chi phí hiệu suất (có thể không đáng kể) của việc đặt văn bản nhãn nhiều lần.
Một cách tiếp cận lặp đi lặp lại hoàn toàn có thể trông giống như thế này:
var text = ""
for action in actions {
if text.isEmpty {
text = action.name
} else {
text += " | \(action.name)"
}
}
actionLabel.text = text
Mapping và tham gia những hoạt động phổ biến như vậy mà hầu hết các ngôn ngữ có cách gọn gàng sạch sẽ để làm việc đó mà không lặp lại. Ví dụ, tôi muốn giới thiệu sau đây trong Objective-C:
actionLabel.text = [[actions valueForKeyPath:@"name"] componentsJoinedByString:@" | "];
Nguồn
2014-09-23 06:42:33
+1 cho 'map' và 'join', đây có thể là giải pháp dễ nhất cho vấn đề này và có khả năng cũng là rõ ràng nhất. –
+1 nil coalesce và cho tham gia/bản đồ - một giải pháp sạch hơn nhiều – ColinE
Thanks @Brian. Một điều nhỏ. Khi tôi nhận được chuỗi cuối cùng, có vẻ như sau ** Action1 | Action2 | Action3 | **. Nó có thêm một đường ống ở cuối. Làm thế nào tôi có thể có chuỗi mà không có đường ống như sau ** Action1 | Action2 | Action3 ** – Isuru