我已经结束了(我带了很多THX到dfri!)不知道如何改变它:

let attributesOverRanges = fooAttrString.getAttributes()
for (rng, attributes) in attributesOverRanges {
    print("Attributes over range \(rng):")
    attributes.forEach { print("\t\($0.0) = \($0.1)") }
}

这是一些结果行:
Attributes over range (0,12):
    NSFont == <UICTFont: 0x7fc7f2d31330> font-family: "Helvetica Neue";
font-weight: bold; font-style: normal; font-size: 17.00pt

现在我必须得到信息
恩朗格
NSFont字体
字体系列:“Helvetica Neue”;字体粗体;字体样式:普通;字体大小:17.00pt
给他们一个数组/字典。我试了很多,但我无法解决这个问题,感觉自己像个菜鸟一样(英语很糟糕)!:-(
你能帮帮我吗
在回答了@rickster之后,我试着用粗体字。但是我得到了一个错误,因为let value=$0.0检索的不是字符串而是字体。我能把字体转换成字符串吗??? 我得在绳子上找到“粗体”。或者你不知道用另一种方法来检查粗体
let attributesOverRanges = fooAttrString.getAttributes()
var newAttributes: [(NSRange, String)] = []
for (rng, attributes) in attributesOverRanges {
    attributes.forEach {
        let value = $0.0
        if value.contains("font-weight: bold") {    // ERROR
            newAttributes.append((rng, "Bold"))
        }
    }
    print(newAttributes)
}

最佳答案

forEach是一种对所有序列类型进行遍历的方法,它是for-in循环的函数式编程版本。传递给forEach的闭包接受一个参数,即正在检查的序列的当前元素。(例如,在[1,2,3].forEach { /*...*/ }中,闭包参数是一个整数。在编写闭包的最短速记中,可以将参数引用为$0,因此在本例中可以为闭包编写{ print($0) }。)
在代码中,attributes是字典。当您在字典上迭代时,元素类型是一个(key, value)元组。解决元组中的项的最短/标签不可知的方法是通过索引:foo.0foo.1等。
把它们放在一起:在forEach闭包中,$0.0attributes字典中的一个键,$0.1是相应的值。
因为您使用的是NSAttributedString的属性字典,所以键是属性名("NSFont"NSFontAttributeName常量的值),值是与该键对应的任何对象类型(在本例中,NSFont实例-您看到的打印内容是通过请求其description得到的字体摘要)。
您可以将它们用作另一个字典(otherDict[$0.0] = $0.1)中的键值对,也可以只在数组中使用该值,因为不太需要保留“NSFont”字符串(myArray.append($0.1))。
找出一个NSFont实例是否代表一个粗体字实际上不是一个简单的问题,而是一个简单的答案。记住,许多字体都有一个wide variety of weights-通常,字体设计者会给超过某个阈值的权重一个标签,在语义上将它们标识为“粗体”,但并不总是这样。
NSFont有一个配套的APINSFontDescriptor可以让您获得一些语义信息。这里有一个获取这些信息的方法,以及你的其他信息,但是你需要调整这个方法以适应你的情况:

for (rng, attributes) in attributesOverRanges {
    print("NSRange: \(rng) - has attributes:")
    for (name, value) in attributes {
        if name == NSFontAttributeName {
            if let font = value as? NSFont {
                print("font name (use with `NSFont(name:size:)`): \(font.fontName)")

                let isBold = font.fontDescriptor.symbolicTraits & UInt32(NSFontBoldTrait) != 0
                print("is bold font: \(isBold)")
            }
        }
    }
}

关于xcode - 无法在Swift中阅读此闭包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36407224/

10-11 14:59