2017-09-20 12 views
8

konwertowane moją aplikację niedawno i wciąż otrzymuję błądSwift Błąd 4 konwersji - NSAttributedStringKey: Wszelkie

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

barButtonItem.setTitleTextAttributes(attributes, for: .normal)

Cały kod:

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 
} 

Odpowiedz

8

Jego spodziewa NSAttributedStringKey (NSAttributedStringKey.font) i wysyłasz String (NSAttributedStringKey.font.rawValue).

Więc proszę wymienić NSAttributedStringKey.font.rawValue z NSAttributedStringKey.font jak poniżej:

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

Otrzymuję to ostrzeżenie. Czy istnieje rozwiązanie? Przesyłanie z "[NSAttributedStringKey: NSObject]" do niepowiązanego typu "[Ciąg: Any]" zawsze kończy się niepowodzeniem – Eazy

+0

Zaktualizowano odpowiedź. Proszę sprawdzić –

+0

Użyłem "let attributes = [NSAttributedStringKey.font: UIFont (nazwa:" Helvetica-Bold ", rozmiar: 15.0) !, NSAttributedStringKey.foregroundColor: UIColor.biały] "i nadal otrzymuję ostrzeżenie – Eazy

11

dlaczego wystąpił ten błąd

Wcześniej swoją attributes jest zdefiniowany jako [String: Any], gdzie kluczem pochodzi z NSAttributedStringKey jako ciąg znaków.

Podczas migracji kompilator próbuje zachować typ [String: Any]. Jednak NSAttributedStringKey staje się strukturą w szybkim 4. Tak więc kompilator próbuje zmienić to na ciąg, uzyskując jego wartość nieprzetworzoną.

W tym przypadku setTitleTextAttributes szuka [NSAttributedStringKey: Any] ale pod warunkiem [String: Any]

Aby naprawić ten błąd:

usuwanie .rawValue i oddać swój attributes jak [NSAttributedStringKey: Any]

+0

Jesteś mężczyzną RockStar! –

1

Jak wspomniano w poprzednich odpowiedziach, NSAttributedStringKey było zmieniono na struct w Swift 4. Jednak inne obiekty, które używają najwyraźniej nie zostały zaktualizowane w sa mój czas.

Najprostszym fix, bez konieczności zmiany któregokolwiek z drugą kodu jest dołączać.rawValue do wszystkie swoich wystąpień NSAttributedStringKey ustawiaczy - przekręcenie nazwy klawiszy na String s:

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

Note że teraz nie będziesz już potrzebował ! w as.

Alternatywnie, można przejść do obsady na końcu as deklarując tablicę być [String : Any] góry:

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

Oczywiście, trzeba jeszcze dołączyć .rawValue dla każdego NSAttributedStringKey pozycji można ustawić.