Ios 在swift 2中使用addAttribute时发生NSRangeException错误

Ios 在swift 2中使用addAttribute时发生NSRangeException错误,ios,swift,twitter,xcode7,Ios,Swift,Twitter,Xcode7,我正在学习斯坦福大学的cs193P“使用swift开发IOS 9应用程序”课程。我正在做讲座的第四项作业。该应用程序从twitter获取推文,其中包括您搜索的单词。 我尝试改变以特殊字符(@、#或http)开头的单词的颜色 当我编译应用程序时,它成功地改变了颜色,应用程序运行没有问题。但当我向下滚动,我的应用程序试图显示新的推文时,它崩溃,出现以下错误 由于未捕获的异常“NSRangeException”而终止应用程序,原因:“NSMutablereArray objectAtIndex:eff

我正在学习斯坦福大学的cs193P“使用swift开发IOS 9应用程序”课程。我正在做讲座的第四项作业。该应用程序从twitter获取推文,其中包括您搜索的单词。 我尝试改变以特殊字符(@、#或http)开头的单词的颜色

当我编译应用程序时,它成功地改变了颜色,应用程序运行没有问题。但当我向下滚动,我的应用程序试图显示新的推文时,它崩溃,出现以下错误

由于未捕获的异常“NSRangeException”而终止应用程序,原因:“NSMutablereArray objectAtIndex:effectiveRange::Out-bounds”

我正在使用Xcode 7.3.1和swift 2.2

我在Stackoverflow和google上搜索,发现了以下类似的问题

在这些问题中,上述问题与射程长度有关,或者与射程长度有关的NSRange使用不当

就我而言,我看不出与长度有关的任何问题。您可以在Github中查看我的整个项目

public class Mention: NSObject
    {
    public var keyword: String              // will include # or @ or http prefix
    public var nsrange: NSRange             // index into an NS[Attributed]String made from the Tweet's text

    public override var description: String { return "\(keyword) (\(nsrange.location), \(nsrange.location+nsrange.length-1))" }

    init?(fromTwitterData data: NSDictionary?, inText text: NSString, withPrefix prefix: String)
    {
        guard
            let indices = data?.valueForKeyPath(Tweet.TwitterKey.Entities.Indices) as? NSArray,
            let start = (indices.firstObject as? NSNumber)?.integerValue where start >= 0,
            let end = (indices.lastObject as? NSNumber)?.integerValue where end > start
            else {
                return nil
        }

        var prefixAloneOrPrefixedMention = prefix
        if let mention = data?.valueForKeyPath(Tweet.TwitterKey.Entities.Text) as? String {
            prefixAloneOrPrefixedMention = mention.prependPrefixIfAbsent(prefix)
        }

        let expectedRange = NSRange(location: start, length: end - start)

        guard
            let nsrange = text.rangeOfSubstringWithPrefix(prefixAloneOrPrefixedMention, expectedRange: expectedRange)
            else {
                return nil
        }

        self.keyword = text.substringWithRange(nsrange)
        self.nsrange = nsrange
    } }
可以看出,开始总是比结束大。这就是为什么在expectedRange中长度(即结束-开始)永远不能为负

最后,下面是导致崩溃的代码(以“tweetTextLabel?.AttributeText”开头的行导致崩溃)

类TweetTableViewCell:UITableViewCell
{
@IBOutlet弱var tweetScreenNameLabel:UILabel!
@IBOutlet弱var tweetTextLabel:UILabel!
@IBOutlet弱var tweetProfileImageView:UIImageView!
@IBOutlet弱var tweetCreatedLabel:UILabel!
推特:推特,推特{
迪塞特{
updateUI()
}
}
var SINTESLIST=[Array]()
私有func updateUI()
{
//重置任何现有tweet信息
tweetTextLabel?.attributedText=nil
tweetScreenNameLabel?.text=nil
tweetProfileImageView?.image=nil
tweetCreatedLabel?.text=nil
//从我们的推文中加载新信息(如果有)
如果让tweet=self.tweet
{
tweetTextLabel?.text=tweet.text
如果tweetTextLabel?.text!=无{
对于tweet.media中的uu{

tweetTextLabel.text!+="在第二个列表的内部for循环中,title.nsrange是否大于tweetTextLabel.AttributeText的范围?如果大于,则会导致范围异常。title.nsrange是tweetTextLabel.AttributeText?的一部分。这就是它不能大于的原因。我将部分代码编辑为整个代码以提供更好的想法。您确定NGE是相同的?范围异常告诉您它们不是。在内部for循环内设置一个断点,并在调试器中查看范围。@MarkSzymczyk我在内部for循环内放置了一个断点。我使用NSRange方法计算了tweetTextLabel的范围(位置:0,长度:tweetTextLabel?.AttributeText!.length)。在某些tweet中,范围是正常的,但在某些情况下,位置和长度都会出现一些奇怪的天文数字。尽管如此,当我在内部for循环中放入print语句时,所有值似乎都正常。在第二个列表中,title.nsrange似乎在tweetTextLabel的范围内。在内部for循环中,title.nsrange是否大于rtweetTextLabel.AttributeText?的范围?如果是,则会导致范围异常。提及.nsrange是tweetTextLabel.AttributeText?的一部分。这就是它不能更大的原因。我将部分代码编辑为整个代码以提供更好的思路。您确定范围相同吗?范围异常告诉您它们不相同。设置断点在内部for循环中,查看调试器中的范围。@MarkSzymczyk我在内部for循环中放置了一个断点。我使用NSRange方法计算了tweetTextLabel的范围(位置:0,长度:tweetTextLabel?.AttributeText!.length)。在某些tweet中,范围是正常的,但在某些情况下,位置和长度都会采用一些奇怪的天文数字。尽管如此,当我在内部for循环中放入print语句时,所有值似乎都正常。antify.nsrange似乎在tweetTextLabel的范围内