gpt4 book ai didi

cocoa - 停止 enumerateAttribute :inRange:options:usingBlock: from calling my block with nil values

转载 作者:行者123 更新时间:2023-12-03 16:12:35 31 4
gpt4 key购买 nike

我在没有 kCTFontAttributeName 范围的现有 NSAttributedString 上调用以下选择器:

[attributedString enumerateAttribute:(NSString *) kCTFontAttributeName
inRange:NSMakeRange(0, [attributedString length])
options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired
usingBlock:^(id value, NSRange range, BOOL *stop) {
NSLog(@"Attribute: %@, %@", value, NSStringFromRange(range));
}];

我得到了下面的输出,但我预计不会得到任何输出。有建议吗?

Attribute: (null), {0, 27}
Attribute: (null), {27, 1}
Attribute: (null), {28, 1}
Attribute: (null), {29, 1}
Attribute: (null), {30, 1}

最佳答案

简短的回答? -enumerateAttribute:inRange:options:usingBlock: 并没有按照您(或我最初)的想法进行操作。

从名称来看,您可能会假设它枚举包含给定属性的接收器范围。不是这种情况。它总是枚举整个字符串。它为它遇到的每个运行调用 block 。传递到 block 中的 value 设置为该运行的给定属性的值。如果当前运行不包含给定属性,则会传递 nil 作为 value

因此,对于不包含给定属性的字符串,它仍然会触发该 block ,但将始终为nil。对于完全被给定属性(具有相同值)覆盖的字符串,您希望该 block 触发一次,且 value 等于该属性在字符串中的值。对于部分被给定属性覆盖的字符串,您会期望该 block 会触发多次,有时使用 valuenil,有时使用 等于属性的值。

希望有帮助。我也花了一段时间才从正确的方向看它。

关于cocoa - 停止 enumerateAttribute :inRange:options:usingBlock: from calling my block with nil values,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4555472/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com