ちょうど始めましたSwift 3と私はSwift構文に問題があります。
単純なNSAttributedString
を表示しようとしています。
最初に属性を設定します:
let attributeFontSaySomething : [String : AnyObject] = [NSFontAttributeName : UIFont.fontSaySomething()]
let attributeColorSaySomething : [String : AnyObject] = [NSForegroundColorAttributeName : UIColor.blue]
次に、文字列を作成します:
let attStringSaySomething = NSAttributedString(string: "Say something", attributes: self.attributeFontSaySomething)
私がやりたいのは、1つだけでなく2つの属性を持つ文字列を作成することです。しかし、私がするとき:
let attStringSaySomething = NSAttributedString(string: "Say something", attributes: [self.attributeFontSaySomething, self.attributeColorSaySomething])
Xcodeは、リテラル辞書用にこれを変更することはできず、変更してほしいと言っています。
NSMutableAttributedString
を使用せずに2つの属性を持つ文字列を作成するにはどうすればよいですか?
主な問題は、array[attr.. , attr...]
1つではなく辞書。
2つの辞書を1つに統合する必要があります
let attributeFontSaySomething : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 12.0)]
let attributeColorSaySomething : [String : Any] = [NSForegroundColorAttributeName : UIColor.blue]
var attributes = attributeFontSaySomething
for (key, value) in attributeColorSaySomething {
attributes(value, forKey: key)
}
let attStringSaySomething = NSAttributedString(string: "Say something", attributes: attributes)
ただし、辞書を文字通り作成する方が簡単な場合があります。
let attributes : [String : Any] = [NSFontAttributeName : UIFont.systemFont(ofSize: 12.0), NSForegroundColorAttributeName : UIColor.blue]
両方の属性セットを持つ単一の辞書を作成するだけです:
let attributes: [String:AnyObject] =
[NSFontAttributeName : UIFont.fontSaySomething(),
NSForegroundColorAttributeName : UIColor.blue]
そして、属性付き文字列を作成するときに、キーと値の両方のペアで辞書を使用します。
Swift辞書を結合するための組み込みメカニズムはありませんが、辞書を一緒に追加できるようにしたい場合は、+
演算子のオーバーライドを追加できます。ただし、両方のディクショナリに同じキーが含まれている場合の対処方法を理解するため)
@ vadianの回答に感謝
Swift 4の更新
let attributes : [NSAttributedStringKey : Any] = [NSAttributedStringKey(rawValue: NSAttributedStringKey.font.rawValue) : UIFont.systemFont(ofSize: 12.0), NSAttributedStringKey(rawValue: NSAttributedStringKey.foregroundColor.rawValue) : UIColor(hex:"4C0000")]
refreshControl.attributedTitle=NSAttributedString(string: "Refreshing...", attributes: attributes)
次のように使用します。
let attStringSaySomething = NSAttributedString.init(string: "Hello", attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 16), NSForegroundColorAttributeName:UIColor.black])
Robotoフォントを使用して、さまざまな文字列のさまざまな属性にこのコードを使用できます(Robotoフォント use MDFRobotoFontLoader
)
let yourAttributes = [NSForegroundColorAttributeName: UIColor.black, NSFontAttributeName: MDFRobotoFontLoader.sharedInstance().regularFont(ofSize: 20)]
let finalString = NSMutableAttributedString(string: "", attributes: yourAttributes)
let attributeStr = NSMutableAttributedString(string: "XYZGFDGii", attributes: yourAttributes)
finalString.append(attributeStr)
let yourOtherAttributes = [NSForegroundColorAttributeName: UIColor.red, NSFontAttributeName: MDFRobotoFontLoader.sharedInstance().regularFont(ofSize: 24)]
let partTwo = NSMutableAttributedString(string: "hfjghlkdhkjld", attributes: yourOtherAttributes)
finalString.append(partTwo)
この例ではRobotoフォントを使用します
問題は、[String: Any]
型ではなく、[[String: Any], [String: Any]]
のみを想定している2つの辞書を辞書に挿入していることです。次のことができます。
let attStringSaySomething = NSAttributedString(string: "Say something", attributes: [NSFontAttributeName : UIFont.fontSaySomething(), NSForegroundColorAttributeName : UIColor.blue])
値を辞書ではなくタプルにグループ化し、キーと値に基づいて辞書に挿入することもできます。
let attributeFontSaySomething = (key: NSFontAttributeName, value: UIFont.fontSaySomething())
let attributeColorSaySomething = (key: NSForegroundColorAttributeName, value: UIColor.blue)
let attStringSaySomething = NSAttributedString(string: "Say something", attributes: [attributeFontSaySomething.key : attributeFontSaySomething.value,attributeColorSaySomething.key : attributeColorSaySomething.value])