2014-09-23 15 views
5

Tôi cần nối thêm một chuỗi ký tự và cuối cùng nhận được một chuỗi được hiển thị ở dạng UILabel theo định dạng sau.Nối văn bản trong một vòng lặp trong Swift

Action1 | Action2 | Action3 | Hành động4

for action in actions { 

    actionLabel.text += "\(action.name) |" 
} 

Điều này mang lại cho tôi lỗi sau.

'String?' is not identical to 'UInt8'. 

Bất kỳ lý do nào cho lỗi này? Có cách nào khác để thực hiện việc này không?

Cảm ơn bạn.

Trả lời

14

Đâ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:@" | "]; 
+0

+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. –

+0

+1 nil coalesce và cho tham gia/bản đồ - một giải pháp sạch hơn nhiều – ColinE

+0

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

5

text thuộc tính là tùy chọn có thể là nil. Bạn có thể sử dụng chuỗi tùy chọn để vượt qua điều này. Cũng thiết lập văn bản ban đầu trước khi đi qua vòng lặp.

if actionLabel.text == nil { 
    actionLabel.text = "" 
} 

for action in actions { 
    actionLabel.text? += "\(action.name) |" 
} 
Các vấn đề liên quan