2017-09-20 15 views
8

tôi chuyển đổi ứng dụng của tôi thời gian gần đây và tôi vẫn gặp lỗiSwift lỗi 4 Chuyển đổi - NSAttributedStringKey: Bất kỳ

"Cannot convert value of type '[String : Any]' to expected argument type '[NSAttributedStringKey: Any]?'

barButtonItem.setTitleTextAttributes(attributes, for: .normal)

Tổng số các mã:

class func getBarButtonItem(title:String) -> UIBarButtonItem { 
    let barButtonItem = UIBarButtonItem.init(title: title, style: .plain, target: nil, action: nil) 
    let attributes = [NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!, NSAttributedStringKey.foregroundColor: UIColor.white] as! [String : Any] 
    barButtonItem.setTitleTextAttributes(attributes, for: .normal) 

    return barButtonItem 
} 

Trả lời

8

của nó mong đợi NSAttributedStringKey (NSAttributedStringKey.font) và bạn đang gửi String (NSAttributedStringKey.font.rawValue).

Vì vậy, hãy thay thế NSAttributedStringKey.font.rawValue với NSAttributedStringKey.font như dưới đây:

let attributes = [NSAttributedStringKey.font: UIFont(name: "Helvetica-Bold", size: 15.0)!, NSAttributedStringKey.foregroundColor: UIColor.white] 
+0

Tôi nhận được cảnh báo này. Có giải pháp nào không? Truyền từ '[NSAttributedStringKey: NSObject]' thành loại không liên quan '[String: Any]' luôn không thành công – Eazy

+0

Cập nhật câu trả lời. Vui lòng kiểm tra –

+0

Tôi đã sử dụng "let attributes = [NSAttributedStringKey.font: UIFont (tên:" Helvetica-Bold ", kích thước: 15.0) !, NSAttributedStringKey.foregroundColor: UIColor.trắng] "và tôi vẫn nhận được cảnh báo. – Eazy

11

Tại sao bạn gặp lỗi này

Trước đây, attributes của bạn được định nghĩa là [String: Any], nơi chủ chốt đến từ NSAttributedStringKey như là một chuỗi.

Trong khi di chuyển, trình biên dịch cố giữ loại [String: Any]. Tuy nhiên, NSAttributedStringKey trở thành một cấu trúc trong nhanh chóng 4. Vì vậy, trình biên dịch sẽ cố gắng thay đổi chuỗi đó bằng cách nhận giá trị thô của nó.

Trong trường hợp này, setTitleTextAttributes đang tìm kiếm [NSAttributedStringKey: Any] nhưng mà bạn cung cấp [String: Any]

Để khắc phục lỗi này:

Di .rawValue và đúc của bạn attributes như [NSAttributedStringKey: Any]

+0

Bạn là một người đàn ông RockStar! –

1

Như đã đề cập trong câu trả lời trước, NSAttributedStringKey là đã thay đổi thành cấu trúc trong Swift 4. Tuy nhiên, các đối tượng khác mà sử dụngNSAttributedStringKey dường như không được cập nhật tại sa thời gian của tôi.

Việc sửa chữa đơn giản nhất, mà không cần phải thay đổi bất kỳ mã khác của bạn, là để thêm.rawValue-tất cả lần xuất hiện lại NSAttributedStringKey setters - chuyển tên chủ chốt vào String s:

let attributes = [ 
    NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!, 
    NSAttributedStringKey.foregroundColor.rawValue: UIColor.white 
] as [String : Any] 

Note bạn sẽ không cần số ! tại số as ngay bây giờ.

Ngoài ra, bạn có thể bỏ qua as dàn diễn viên cuối cùng bằng cách tuyên bố mảng được [String : Any] trả trước:

let attributes: [String : Any] = [ 
    NSAttributedStringKey.font.rawValue: UIFont(name: "Helvetica-Bold", size: 15.0)!, 
    NSAttributedStringKey.foregroundColor.rawValue: UIColor.white 
] 

Tất nhiên, bạn vẫn cần phải gắn .rawValue cho mỗi NSAttributedStringKey mục mà bạn thiết lập.

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