2017-09-28 48 views
7

我想創建AttributedString和斯威夫特4 attributedString獲取打字屬性

typingAttributes(from textView)

添加屬性的問題是,

.typingAttributes

回報

[String, Any]

NSAttributedString(string:.. , attributes:[])

需求

[NSAttributedStringKey: Any]

我的代碼:

NSAttributedString(string: "test123", attributes: self.textView.typingAttributes) 

我不想創建循環要經過所有鍵並改變它們到

NSAttributedStringKey 
+0

我不知道爲什麼* *在typingAttributes密鑰字典一個字符串,而不是NSAttributedStringKey。您可能想要提交錯誤報告。 –

+0

我會但現在我想使它工作 –

+0

看起來像有兩個開放的雷達解決這個變化:https://openradar.appspot.com/34994725和https://openradar.appspot.com/34402659 – Aaron

回答

7

您可以映射[String: Any]字典到 [NSAttributedStringKey: Any]字典,

let typingAttributes = Dictionary(uniqueKeysWithValues: self.textView.typingAttributes.map { 
    key, value in (NSAttributedStringKey(key), value) 
}) 

let text = NSAttributedString(string: "test123", attributes: typingAttributes) 

下面是實現這一目的的可能擴展方法,它是 限於字典具有字符串鍵:

extension Dictionary where Key == String { 

    func toAttributedStringKeys() -> [NSAttributedStringKey: Value] { 
     return Dictionary<NSAttributedStringKey, Value>(uniqueKeysWithValues: map { 
      key, value in (NSAttributedStringKey(key), value) 
     }) 
    } 
} 
2

我認爲更好的解決方案。我創建了擴展。

public extension Dictionary { 
    func toNSAttributedStringKeys() -> [NSAttributedStringKey: Any] { 
     var atts = [NSAttributedStringKey: Any]() 

     for key in keys { 
      if let keyString = key as? String { 
       atts[NSAttributedStringKey(keyString)] = self[key] 
      } 
     } 

     return atts 
    } 
} 

https://gist.github.com/AltiAntonov/f0f86e7cd04c61118e13f753191b5d9e

+0

好主意。 - 如果您將擴展名限制爲字符串鍵,則不需要可選的強制轉換。我爲我的回答添加了一個更簡單的版本。 –

0

這裏是我的助手,我使用自定義字體

import UIKit 

struct AttributedStringHelper { 

enum FontType: String { 
    case bold = "GothamRounded-Bold" 
    case medium = "GothamRounded-Medium" 
    case book = "GothamRounded-Book" 
} 

static func getString(text: String, fontType: FontType, size: CGFloat, color: UIColor, isUnderlined: Bool? = nil) -> NSAttributedString { 

    var attributes : [NSAttributedStringKey : Any] = [ 
     NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue) : UIFont(name: fontType.rawValue, size: size)!, 
     NSAttributedStringKey.foregroundColor : color] 

    if let isUnderlined = isUnderlined, isUnderlined { 
     attributes[NSAttributedStringKey.underlineStyle] = 1 
    } 

    let attributedString = NSAttributedString(string: text, attributes: attributes) 
    return attributedString 
} 
}