From 9af0512af33c8b79ec0b61834dbc94b294744c36 Mon Sep 17 00:00:00 2001 From: Shripada Hebbar Date: Wed, 29 Jul 2015 15:57:29 +0530 Subject: [PATCH] Migrated the SwiftRSS to Swift 2.0 --- ...SDate+dateFromInternetDateTimeString.swift | 22 ++-- SwiftRSS/RSSFeed.swift | 26 ++--- SwiftRSS/RSSItem.swift | 42 ++++---- SwiftRSS/RSSParser.swift | 24 ++--- SwiftRSS/String+imageLinksFromHTML.swift | 14 +-- SwiftRSS_Example.xcodeproj/project.pbxproj | 2 + .../UserInterfaceState.xcuserstate | Bin 0 -> 29730 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 23 ++++ .../xcschemes/xcschememanagement.plist | 19 ++++ SwiftRSS_Example/AppDelegate.swift | 8 +- SwiftRSS_Example/DetailViewController.swift | 27 ++--- SwiftRSS_Example/MasterViewController.swift | 19 ++-- ...dateFromInternetDateTimeString_Tests.swift | 24 ++--- Tests/RSSFeed_Tests.swift | 22 ++-- Tests/RSSItem_Tests.swift | 14 +-- Tests/RSSParser_Tests.swift | 100 +++++++++--------- 16 files changed, 218 insertions(+), 168 deletions(-) create mode 100644 SwiftRSS_Example.xcodeproj/project.xcworkspace/xcuserdata/shripada.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 SwiftRSS_Example.xcodeproj/xcuserdata/shripada.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist create mode 100644 SwiftRSS_Example.xcodeproj/xcuserdata/shripada.xcuserdatad/xcschemes/xcschememanagement.plist diff --git a/SwiftRSS/NSDate+dateFromInternetDateTimeString.swift b/SwiftRSS/NSDate+dateFromInternetDateTimeString.swift index 8d96808..1c01572 100644 --- a/SwiftRSS/NSDate+dateFromInternetDateTimeString.swift +++ b/SwiftRSS/NSDate+dateFromInternetDateTimeString.swift @@ -56,28 +56,28 @@ extension NSDate { { NSDate.internetDateFormatter.dateFormat = "EEE, d MMM yyyy HH:mm:ss zzz" - date = NSDate.internetDateFormatter.dateFromString(rfc822_string) + date = NSDate.internetDateFormatter.dateFromString(rfc822_string as String) } if date == nil { NSDate.internetDateFormatter.dateFormat = "EEE, d MMM yyyy HH:mm zzz" - date = NSDate.internetDateFormatter.dateFromString(rfc822_string) + date = NSDate.internetDateFormatter.dateFromString(rfc822_string as String) } if date == nil { NSDate.internetDateFormatter.dateFormat = "EEE, d MMM yyyy HH:mm:ss" - date = NSDate.internetDateFormatter.dateFromString(rfc822_string) + date = NSDate.internetDateFormatter.dateFromString(rfc822_string as String) } if date == nil { NSDate.internetDateFormatter.dateFormat = "EEE, d MMM yyyy HH:mm" - date = NSDate.internetDateFormatter.dateFromString(rfc822_string) + date = NSDate.internetDateFormatter.dateFromString(rfc822_string as String) } } else @@ -86,28 +86,28 @@ extension NSDate { { NSDate.internetDateFormatter.dateFormat = "d MMM yyyy HH:mm:ss zzz" - date = NSDate.internetDateFormatter.dateFromString(rfc822_string) + date = NSDate.internetDateFormatter.dateFromString(rfc822_string as String) } if date == nil { NSDate.internetDateFormatter.dateFormat = "d MMM yyyy HH:mm zzz" - date = NSDate.internetDateFormatter.dateFromString(rfc822_string) + date = NSDate.internetDateFormatter.dateFromString(rfc822_string as String) } if date == nil { NSDate.internetDateFormatter.dateFormat = "d MMM yyyy HH:mm:ss" - date = NSDate.internetDateFormatter.dateFromString(rfc822_string) + date = NSDate.internetDateFormatter.dateFromString(rfc822_string as String) } if date == nil { NSDate.internetDateFormatter.dateFormat = "d MMM yyyy HH:mm" - date = NSDate.internetDateFormatter.dateFromString(rfc822_string) + date = NSDate.internetDateFormatter.dateFromString(rfc822_string as String) } } @@ -134,21 +134,21 @@ extension NSDate { { NSDate.internetDateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ssZZZ" - date = NSDate.internetDateFormatter.dateFromString(rfc3339_string) + date = NSDate.internetDateFormatter.dateFromString(rfc3339_string as String) } if date == nil // this case may need more work { NSDate.internetDateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.SSSZZZ" - date = NSDate.internetDateFormatter.dateFromString(rfc3339_string) + date = NSDate.internetDateFormatter.dateFromString(rfc3339_string as String) } if date == nil { NSDate.internetDateFormatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss" - date = NSDate.internetDateFormatter.dateFromString(rfc3339_string) + date = NSDate.internetDateFormatter.dateFromString(rfc3339_string as String) } if date == nil diff --git a/SwiftRSS/RSSFeed.swift b/SwiftRSS/RSSFeed.swift index 30d20c1..533d7fb 100644 --- a/SwiftRSS/RSSFeed.swift +++ b/SwiftRSS/RSSFeed.swift @@ -15,7 +15,7 @@ class RSSFeed: NSObject, NSCoding { var title: String? var link: NSURL? - func setLink(let linkString: String!) + func setLinkAsString(let linkString: String!) { link = NSURL(string: linkString) } @@ -39,7 +39,7 @@ class RSSFeed: NSObject, NSCoding { } // MARK: NSCoding - required init(coder aDecoder: NSCoder) + required init?(coder aDecoder: NSCoder) { super.init() @@ -48,46 +48,46 @@ class RSSFeed: NSObject, NSCoding { feedDescription = aDecoder.decodeObjectForKey("description") as? String language = aDecoder.decodeObjectForKey("language") as? String lastBuildDate = aDecoder.decodeObjectForKey("lastBuildDate") as? NSDate - generator = aDecoder.decodeObjectForKey("generator") as? NSString - copyright = aDecoder.decodeObjectForKey("copyright") as? NSString + generator = aDecoder.decodeObjectForKey("generator") as? String + copyright = aDecoder.decodeObjectForKey("copyright") as? String - items = aDecoder.decodeObjectForKey("items") as [RSSItem] + items = aDecoder.decodeObjectForKey("items") as! [RSSItem] } func encodeWithCoder(aCoder: NSCoder) { - if let title = self.title? + if let title = self.title { aCoder.encodeObject(title, forKey: "title") } - if let link = self.link? + if let link = self.link { aCoder.encodeObject(link, forKey: "link") } - - if let feedDescription = self.feedDescription? + + if let feedDescription = self.feedDescription { aCoder.encodeObject(feedDescription, forKey: "description") } - if let language = self.language? + if let language = self.language { aCoder.encodeObject(language, forKey: "language") } - if let lastBuildDate = self.lastBuildDate? + if let lastBuildDate = self.lastBuildDate { aCoder.encodeObject(lastBuildDate, forKey: "lastBuildDate") } - if let generator = self.generator? + if let generator = self.generator { aCoder.encodeObject(generator, forKey: "generator") } - if let copyright = self.copyright? + if let copyright = self.copyright { aCoder.encodeObject(copyright, forKey: "copyright") } diff --git a/SwiftRSS/RSSItem.swift b/SwiftRSS/RSSItem.swift index f8915f6..0261c4e 100644 --- a/SwiftRSS/RSSItem.swift +++ b/SwiftRSS/RSSItem.swift @@ -12,15 +12,15 @@ class RSSItem: NSObject, NSCoding { var title: String? var link: NSURL? - func setLink(let linkString: String!) + func setLinkAsString(let linkString: String!) { link = NSURL(string: linkString) } - + var guid: String? var pubDate: NSDate? - func setPubDate(let dateString: String!) + func setPubDateAsString(let dateString: String!) { pubDate = NSDate.dateFromInternetDateTimeString(dateString) } @@ -31,7 +31,7 @@ class RSSItem: NSObject, NSCoding { // Wordpress specifics var commentsLink: NSURL? - func setCommentsLink(let linkString: String!) + func setCommentsLinkAsString(let linkString: String!) { commentsLink = NSURL(string: linkString) } @@ -40,7 +40,7 @@ class RSSItem: NSObject, NSCoding { var commentRSSLink: NSURL? - func setCommentRSSLink(let linkString: String!) + func setCommentRSSLinkAsString(let linkString: String!) { commentRSSLink = NSURL(string: linkString) } @@ -50,7 +50,7 @@ class RSSItem: NSObject, NSCoding { var categories: [String]! = [String]() var imagesFromItemDescription: [NSURL]! { - if let itemDescription = self.itemDescription? + if let itemDescription = self.itemDescription { return itemDescription.imageLinksFromHTMLString } @@ -59,7 +59,7 @@ class RSSItem: NSObject, NSCoding { } var imagesFromContent: [NSURL]! { - if let content = self.content? + if let content = self.content { return content.imageLinksFromHTMLString } @@ -73,7 +73,7 @@ class RSSItem: NSObject, NSCoding { } // MARK: NSCoding - required init(coder aDecoder: NSCoder) + required init?(coder aDecoder: NSCoder) { super.init() @@ -81,8 +81,8 @@ class RSSItem: NSObject, NSCoding { link = aDecoder.decodeObjectForKey("link") as? NSURL guid = aDecoder.decodeObjectForKey("guid") as? String pubDate = aDecoder.decodeObjectForKey("pubDate") as? NSDate - itemDescription = aDecoder.decodeObjectForKey("description") as? NSString - content = aDecoder.decodeObjectForKey("content") as? NSString + itemDescription = aDecoder.decodeObjectForKey("description") as? String + content = aDecoder.decodeObjectForKey("content") as? String commentsLink = aDecoder.decodeObjectForKey("commentsLink") as? NSURL commentsCount = aDecoder.decodeObjectForKey("commentsCount") as? Int commentRSSLink = aDecoder.decodeObjectForKey("commentRSSLink") as? NSURL @@ -92,52 +92,52 @@ class RSSItem: NSObject, NSCoding { func encodeWithCoder(aCoder: NSCoder) { - if let title = self.title? + if let title = self.title { aCoder.encodeObject(title, forKey: "title") } - if let link = self.link? + if let link = self.link { aCoder.encodeObject(link, forKey: "link") } - - if let guid = self.guid? + + if let guid = self.guid { aCoder.encodeObject(guid, forKey: "guid") } - if let pubDate = self.pubDate? + if let pubDate = self.pubDate { aCoder.encodeObject(pubDate, forKey: "pubDate") } - if let itemDescription = self.itemDescription? + if let itemDescription = self.itemDescription { aCoder.encodeObject(itemDescription, forKey: "description") } - if let content = self.content? + if let content = self.content { aCoder.encodeObject(content, forKey: "content") } - if let commentsLink = self.commentsLink? + if let commentsLink = self.commentsLink { aCoder.encodeObject(commentsLink, forKey: "commentsLink") } - if let commentsCount = self.commentsCount? + if let commentsCount = self.commentsCount { aCoder.encodeObject(commentsCount, forKey: "commentsCount") } - if let commentRSSLink = self.commentRSSLink? + if let commentRSSLink = self.commentRSSLink { aCoder.encodeObject(commentRSSLink, forKey: "commentRSSLink") } - if let author = self.author? + if let author = self.author { aCoder.encodeObject(author, forKey: "author") } diff --git a/SwiftRSS/RSSParser.swift b/SwiftRSS/RSSParser.swift index 46f51fd..4ff68c8 100644 --- a/SwiftRSS/RSSParser.swift +++ b/SwiftRSS/RSSParser.swift @@ -54,7 +54,7 @@ class RSSParser: NSObject, NSXMLParserDelegate { { self.callbackClosure = callback - var parser : NSXMLParser = NSXMLParser(data: data) + let parser : NSXMLParser = NSXMLParser(data: data!) parser.delegate = self parser.shouldResolveExternalEntities = false parser.parse() @@ -69,13 +69,13 @@ class RSSParser: NSObject, NSXMLParserDelegate { func parserDidEndDocument(parser: NSXMLParser) { - if let closure = self.callbackClosure? + if let closure = self.callbackClosure { closure(feed: self.feed, error: nil) } } - func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [NSObject : AnyObject]) { + func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { if elementName == node_item { @@ -90,7 +90,7 @@ class RSSParser: NSObject, NSXMLParserDelegate { if elementName == node_item { - if let item = self.currentItem? + if let item = self.currentItem { self.feed.items.append(item) } @@ -99,7 +99,7 @@ class RSSParser: NSObject, NSXMLParserDelegate { return } - if let item = self.currentItem? + if let item = self.currentItem { if elementName == node_title { @@ -108,7 +108,7 @@ class RSSParser: NSObject, NSXMLParserDelegate { if elementName == node_link { - item.setLink(self.currentElement) + item.setLinkAsString(self.currentElement) } if elementName == node_guid @@ -118,7 +118,7 @@ class RSSParser: NSObject, NSXMLParserDelegate { if elementName == node_publicationDate { - item.setPubDate(self.currentElement) + item.setPubDateAsString(self.currentElement) } if elementName == node_description @@ -133,17 +133,17 @@ class RSSParser: NSObject, NSXMLParserDelegate { if elementName == node_commentsLink { - item.setCommentsLink(self.currentElement) + item.setCommentsLinkAsString(self.currentElement) } if elementName == node_commentsCount { - item.commentsCount = self.currentElement.toInt() + item.commentsCount = Int(self.currentElement) } if elementName == node_commentRSSLink { - item.setCommentRSSLink(self.currentElement) + item.setCommentRSSLinkAsString(self.currentElement) } if elementName == node_author @@ -166,7 +166,7 @@ class RSSParser: NSObject, NSXMLParserDelegate { if elementName == node_link { - feed.setLink(self.currentElement) + feed.setLinkAsString(self.currentElement) } if elementName == node_description @@ -202,7 +202,7 @@ class RSSParser: NSObject, NSXMLParserDelegate { func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) { - if let closure = self.callbackClosure? + if let closure = self.callbackClosure { closure(feed: nil, error: parseError) } diff --git a/SwiftRSS/String+imageLinksFromHTML.swift b/SwiftRSS/String+imageLinksFromHTML.swift index 578f766..2ad487c 100644 --- a/SwiftRSS/String+imageLinksFromHTML.swift +++ b/SwiftRSS/String+imageLinksFromHTML.swift @@ -15,19 +15,21 @@ extension String { var error: NSError? - var full_range: NSRange = NSMakeRange(0, countElements(self)) + var full_range: NSRange = NSMakeRange(0, self.characters.count) - if let regex = NSRegularExpression(pattern:"(https?)\\S*(png|jpg|jpeg|gif)", options:.CaseInsensitive, error:&error) - { - regex.enumerateMatchesInString(self, options: NSMatchingOptions(0), range: full_range) { - (result : NSTextCheckingResult!, _, _) in + do { + let regex = try NSRegularExpression(pattern:"(https?)\\S*(png|jpg|jpeg|gif)", options:.CaseInsensitive) + regex.enumerateMatchesInString(self, options: NSMatchingOptions(rawValue: 0), range: full_range) { + (result : NSTextCheckingResult?, _, _) in // didn't find a way to bridge an NSRange to Range // bridging String to NSString instead - var str = (self as NSString).substringWithRange(result.range) as String + var str = (self as NSString).substringWithRange(result!.range) as String matches.append(NSURL(string: str)!) } + } catch var error1 as NSError { + error = error1 } return matches diff --git a/SwiftRSS_Example.xcodeproj/project.pbxproj b/SwiftRSS_Example.xcodeproj/project.pbxproj index d7cf803..143947f 100644 --- a/SwiftRSS_Example.xcodeproj/project.pbxproj +++ b/SwiftRSS_Example.xcodeproj/project.pbxproj @@ -222,6 +222,8 @@ 119025CE19B92DA1009184BE /* Project object */ = { isa = PBXProject; attributes = { + LastSwiftMigration = 0700; + LastSwiftUpdateCheck = 0700; LastUpgradeCheck = 0600; ORGANIZATIONNAME = "Thibaut LE LEVIER"; TargetAttributes = { diff --git a/SwiftRSS_Example.xcodeproj/project.xcworkspace/xcuserdata/shripada.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftRSS_Example.xcodeproj/project.xcworkspace/xcuserdata/shripada.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..fe49b610d6f3a570a9a97d616d462752e5c79657 GIT binary patch literal 29730 zcmeHv349aP`skdQ%uL$SlJ4nBx;H?&uRv+`wzPDi`;w+9D}#ifDUx zj}L*a-T06<*-x;9nD8e8h(JP0OeUrfQwar;KqL}LL^6>=q!O7#4l$FcBC3fRqL!#5 z>WK!zKr|9YqKQ~YEFu;YeZ&%?pIAyPBbF0a5Z4gb5;qd7h&ze9h`Wik#0Fv~@i6fS zv5VMEJW4!9JWlK(ULam1ULy7rexXHkyIdNP`N{EL4K3Q4Oj^ zb*LV-pjKo?9jFsokqs?I7;)%IbUnHO-H2{O8_*EijvhphpvTbT=t;B}y@39XUPXt{ z+vp?oF*=S;qci9n`U(Av&ZA#QchZBLKzfp1Ev`$ zMdp#SNdwtP8p$ToL^hKx?V6iJK0P2kt@iRC&{PCL*!xd2>BLylzf|fhkTbjM!rXWNPa?oO@2du zOMXXwPoASFN<_I)o>UMOMnzH4R2&sg$*IZI6e@vArqZZsl#Iw=|9Cami6}5_5P2EJ@Ox;1PrPfhfsIAmCYCE-qx}SQ4 zdYpQe+Dq-Do}-?pUZGy4UZdWm-lpE6-ldLHpHL^LPpQwSGt}22Kao@vBnlISiy}o) zqBv2!XsSpdN*1MvGDMl8>7p4TrAQ^xiS(jbqC!!Ls8m!Tsub0V>O_qqqo_sHD(Vnf zM7^SgqD7*`qN_#Mh^`f_5UmtlC%RsAgXm7tU81{1Yen~owurWhwuv4UJtlfwv`6%U z=ta>>qWz-7q9dZWL`OxRh)#$;6@4c9PV~L#tmp@tpb<^d6g`oa(B8BU9ZpZ8W%N{9 zK_}3O^mKX#okP#0XVHap5j~r(rR(T=x`FPXE%aP^9=(X}r$RshzObV0A;vVhWieW;RpJ z)G)P-fiW=)7%O9A>`X7SkXgbkW0o^lFqpZ9S;O4H+{vtC)-xNK0cJCEAG4j=!92}8 z!#vCEW%e=8G0!tEFfTF(nB&YR%n9aG<}>Cb^Eq>hIn8{-{J>mbeq(8tVI{0L>%;o8 za&|I1g`LVO*aS9_O=6ST6gHjBVyCk+SruEx&SA^h3bvB1VyoFYww`TdTiLm+m9??` z>{9k>_8N8-yP6$hH?#M#TiC7aHg-F^gT0@9fZfIJX8*=M$-c-QVBcduXHT)G*)#07 z?04)>?62$vF(DR-X|bEwUF;#ADE1ZmiDlvlailmwoG4BbCyP_WS>kMQu2?HB63-S_ zimSv8Vw2b+o-4MBZQ@1ZrD9IJLcB_Ri}-f&-Qu<44dP9e(OtcroreiG!kzFSCJ++B zue!KAVV=3qRtKNMIr_dKv@A`gA}u*pt59dArYp3mTD4Z2k)hJ)Qj8M60vgR6}aDL)NMS8Mm83RAP% zWG%2&S!|Z(PIIH{h2CnKZ#GII;6aJC)oeAly5gYuYU`O6p zc3BqmnhRQCot8F>*=m$bg666gJD8#IAsQt?u31!ccXu|Anx9cJbM#yH zkb@1QV1=L9S{L}U@!#57`hoxlNIfR7sCtJwyOqOw{|eS^?oMon>fiNnCUIZ2dD z%p&C52_>N-)P#o65;{UpUI2ecE(CtJakZCqiOq39%L>UmT zoT$KIK&)bXJ-!8>#lK@u4uQ=gakT-~uWPl~yR9m#*<_SR;CFdP_o8CcLQA^|9>W4v zHXFDErY^hC&{kyX>+S_MQ(P8zm3B*~#oot*EC+wWUS%;a5@5UF3d4<|^%(SP%{EJW z*BA&5JQ%IHxwpNYC%kj2!eAD&jpsIip|^CJOHKBUdf{i0soCrjOA|4VkZ&WJi58-j zFcWP=JJCT{h`Bf%Pr@=Bfg^Dgj>a)Kb{pVuz5|c5i3Nm}un~5^V4MSs#kdaJupKYs znP0-A%Q-7yRRJ)vfUDWvt!866;I7qVZRK&zHx^!j^i~NDmGHZ~w|PFat{c@+;tM^r z<~CDrr`<7v0A4oysFd$+vx6wiG51)_Huz$)gM$V#g+7A*?M_u#az^> ze3)Kidqt_9>^T0)-7#wo{TazA8R=7H$;p|?%j)_wlhRXCd8I0-%~y%n8j8zZ`~Z6L zRbs|l#2dsxFtu+Ihls<(5#lZ4C@~x4(Yb`8?iPnQG>)K-R|}37^MOxC9`h!mtJS=? zq|MoPRrA zIBk@K!c<0>4#ox1alj}wS*(M^8DhpiXycs8m&8}Zr+5}F#QBwu!6c;f)%PH>pW@jd zvM?t}InQP=F{5rVFh{3Z0;vBPmU5o>h4_`YP~ST2gaB{W+MPUvOK}+{j1qkt$j-FH z#KfxZPHWw*$FagYh-e<%Uv6)dWZHpT#vXxmi!Anzir)Fnoz~giE%S`Fj_%&h z);VTikFJUi^BhZihrPLxx9pOhiq$r0}mrN!UMSz7tjRa z7v9NiHrdSe@M$%70?RKnV**#axgCP2knUha4nVqGxqm`XCpW{DM=ux>B->a3~N;sj3yECAryi_Q5Xux^|%2W zaN`h?p$Osxio!;02A*!m)ip)tHitJ*E36z0dYxcw9F|hz4^(lPESJf14l@}g^21C) zQ;`BC;3jOs&A4R!$LS?jG<_Wn*4Cx_4W_{@PlsmLBkkK)VHuY2tv+n*#xD(};|XE`x(|P%hX=G!wTC z5WEn<+`Pe^wRLxz!IFUbNbH0Hvs$@Eb&BXbzr-I|oq(s>Jhg7giYn%!s1lbzoHmzqHw=_AZOPx7F;TOq8;p zaQt(^Y(T~_Fq@DG_uvIsHA2HEHJAiud!arNMonLq_T8J0nB_j*(Lrcd@av55V7vnydByf}p8Uv-fI6YQ1KT#T|L!;jD|hXuJBn14JAGRA%g zmSPMB&{Kee^$@qaK%B!XVB#w=7<|}cqkX)7S_3E(Hdp9H^pa5$2b6PJ;xRjlu_PKq z`+2qgSDOoreE_{|ltlf75eCsKJoLZP)F}e5p*LKze-Ph*tA#}#=GpxSdJEr(ZyI6u zchGxdSoeMO0bYeyV^wLC^2(dXaQP?bvx}O34oz>yswidG#xX6wK;QD}^-J^>`Wk(M z*Wg?6ZTR*f^d0&hokc(3JMa#C5WmR_r)-R&a&77oT&@rJ9hYh15GzoEPLI&l*(eFS zOc%kabRz0kk|gB!p$q6Y^gH^4BuIqs#CPGl@mjnNufLC^ND)|sNRlPR_#Qk2R>2eB zhqv(4=Hn&0#XYbcGq*Z)DKD@>#KARN*WYUslsLT8 zb@Ao~HY9wEV~)86M9pcsFK)wcRENE2Xb3xLUfnqHF=~fKdXv6{-vH@@Hw=(|_+F=G z63m#&HoB>l3R4E%P+p^ZC6rzvXhE z8B{sEaxiU$)dX8HpsQoQ2W~*1R-NbK8;6qbvI~BU0~|OVC0(6;b9%eFfIrlo;Qu*d z6k|vq#t%H)vH;XMjBSV3!_b^qZY4W_Vx*aDBir#Vyc<8diL{V&$$9uO`~-fTUjgqr zIi@*=fra>(<9VsoywK9!3tV&2GI$-RTWoIW<#*e*lfbKqR=et zsmTSTZGg1m$MGIvr{K_x0?9hh&$#S!O6FgZ=%mB|5emGaLgv5m3X0jdDv5Z_! zUV$Hlwfqe~iJ#g`a^#f|ZHXhV!B697z=!k3`*?Pbajr_$31+ypk4IIPzS~-CUQ}x8 zwV7KTv@lANpJ@X&WS0k*o2ucrV^Fj*I~zoU-HGBgtZ7WXVGJTT$@2hRA!#jpP71h+o9} z@yqxXm&GPGJ8bbwf-P=Il3hI4gxMyDC|P;ekY_<5D4VblerhePMct-WS^Qt>B9E8L z6fz~@>sfwU&PTf)k6smK8a<cX;CHuydO1M8Ouho2uaU3A--DoFj^X$4`|$ZK{to_r?^HNC ztF_yDv2g&?2z;r5Xt=2d_#0mH@f7}RX-d1btZMHZf zN)>iK+|~vsEVF?HOzpy6i#!W1Ao&A6fhEU?pUI!dpULy&FN6pAD{-E@K>kMlPX0mu z0lwo&il7j20scP+Yq8l)Rzb-^7^15fcISLN*~i?~>d?HSA9}Zp33C;hyFlhalRF|y zx-N(ZK^J%=^ewVL!Y%#JqEQxdxXDoq)?txr6?qJn-i(Pn7bae8;0NN;^Ec}C$IMY$_CTa$i zL(RlL;-B%aBUDyV+R>W`N=NDOIs6lEq4{GNmlGuHl{=b7?<=T6s(4K25~>uR$G<>O z0=f#@V4>fdBV+niQZ-}x)lzl%0{+c8sO#KE=-i_m)7eNh6Y@c-i8A3oI0V6da4sBf z1t^*jhu-9Uvtd_^H+KSwK-Eohy&dI`jcJklUkqRZ-;EpCbdqNtWrITss*{>eby3|^ z54C`@a!AA>I3Z>@#BxZ?AvX@WZz1BSUTPt=h+0hbQA@Blhdem+D2MiN=p_!F;m{Yn zV)avly`9(7ZRxVx97m;a&H@{i;Nf#5fdmex$Of(zgbHm9!ij2mONW_1w)GQ!f+q`M zFwmS1?PruE6@jzB%TA{m0FIm%3Ek8Xlx%f$grh)+sX`D9b~;XVBpmDlx}}005+>n% z%g@1yjjO4Z;QLb7P}fo`I5dGnaCqspiMo!up1OfU6FH>d(4G7;GX;;y@i(>9+Ra~5 zD(~fjF#I;PEEj=Ms*z~z*U6QC{XZg|^{Z>hV% z;j7}1_dgdJcdCA;f0?kDKbGi$1t&VkT~7^wR;KQuHc?1f$e`BMuqMF2oA=?ZAYT7QA+bzUG)OB z|DqxPP95Noj6)HQh|aRT4%H@T_1Ad|`UVG4b;%Lx5FEU~@e6gBIzqig9jz5?3vA;! z6w9F)4n=cl%D;`f;JB`R*B!Z=7CCWyjQW6AvhPvvb105O@q^Td)JGhWb7(TIt{&!^ zDkr5biAP+Xc!D2ulKR{k6mrV*#q6?)Iz^r4y%`~Pbh&2Z`!vpFd_jFVCLB$DBSM7y zA&EEjE%hDsJ$07)f%=g;NBuXQ-6pE4kd6Xi9;zIO5;!lhq5>{ zjYBgyG?PP04yie$<&d63`5cloD{3KUdJ zqES-yFL;$s)dDAUc9W%(w|=9xgEsyUaFiYsg$jcu8@*A>V#Q)!9Vy^4L$Bksud;yG zm6Zi9X&8Z&+X-jKz2ME~ID~lA5m(Xhiv)+Vixp%_(E-~=vo$AC)dR{!@WE}up{$}A zCYoUC=}F|FL-4|NxM;Q}mcpqR>=@_U5-p`2-CgE#%luw=)NM`Z8GhqDiG;@G+QLiP zWhW#h*jnc$miNKtcz$A$rP&H+<%y0<19O&Bi4aJ z1;EU)^zc)%Ij00e4Znm%Wszk_04Y z8ztI*LL<1&;rUJG=!*!W>6b2mo(}Y@|A+LOV}=`iHv9ieWE@`dzmuBN1eE6(z1>b< zg7O*-Pqtjxuy(a8TFq?`maye$b?VBzm{e_YOiGgLd#un#P^^j`xF2K7NvwoBC$>ae z2b_1CT1_r>H+)+IbfiODgU+Pjjndsok;TD1_?S?c2tEJU! zOX!$y>VYNxhpob~A_WAu6@uO$wsrs6%Yi`r|L}6a2W^GRSiCm?@#9PQ$kNr)36~%K z^Vnrr_Jlh@;IE`+W&EcvVptWyp^kN!`TsNZks!%%|HEwM<17l^*#2jWagPv78KaV7 z{||KC$MMSrOPFw}dnLTkK#XdN%GTG_(gBB_{Nbo0zSZus)UJ;In|bli^%gJc|5JOQ z5ij6UbpLnH>(UX2_e%dG{>z`!Xn1DAHdw)@d*nDY!#}b0NbFE?{9d?Z{Qo%nL%XKK6@h{Pj25u057yj#E9iBRuPP$ou3rQK8e+50RGqOt|w+oO< zjFQ>^0%YeVmA9c4`lx5QgUwF5IkvhEq~!ZIXxv~S#5uMHYDRDC%YDNqv)1# z(X&Q$D=g%84jDMq$S=ewpywE?^!;0Xe`-n=fJsVCT~;Mz6ATC7Me9Tx$Avc_8U%Pl z95QjJnTOXRz&rlRUB5kC!^6nROa)x0C6B@Nb`c!;j6=PhqK5(8E)JPF)W(B@j0B!~ z8zw*C_oHLIDe0+6kbab$k)6#i-nHN-M9+*1@mUdMQi-19kcC5Yd5H4_hzCoC+_MD? zCTC~D3^Ou;Ge)@K@1obnh4;GX4S@G1hvsvri-*@eJi`f#cV{>BXQiaWy~-3oAxttO zJ3SdDnc|w{+oJc!1^R*LLjd|QhZbgC`*J^)@M0A6K^+1M|vJ}E7oUwt~PKFbC3N6{~rh54)K z0>J#8Lwy`t!o%zrVBWNH^4h_M{?sf%#4=KVEg>x$=%+NYo4^ZLs>P8N&;-Rh`rXI`vRGI4RRMjX0OkW`YT6YN`wJu$!OV7+usIxM& z6=`~?0HDsyOjTrOWUB#mQhJ6~KN`^00-$>?0i@EU=+!9zBP%H@MUj@43>5*=(=`fJ zQf9U`Gf9`3o}E4#&~*Z!doKZ`NzKU2(q<dSn?L1SV-SV{7m0PLnaK7 zOfR8fX%e&J3cuqXvm+;~7HSWe7xT%T9J&t^Vh-KSp`pX{z4S(aaFQON2jO;Martm+ zq`d>K@wGcLK}S7v-1e400fx4}?}*>1~h>2KSgoUH))h zW!OY-r+4sY)0cVwr-#z?12lhcfqsxfTLtXe4wy(6b!cyOsVK?x97}ztR`z-{{|oI1cTDOKG64z=e38LxAfS;kT+*I0JyA z=sJr{*J)|zi)jEK36CKH1D6yFY}FRX_k`Q9a6fDG3n%-*jaK2YBO%NVm!Tjf+4WEW zqBqUAboRl0w9x?g6oyVd&-9WJ;cUId3U|E#%0(wKaBL05G+GzhTOE_TIM6;VJu^F1 zlcrBsWTxtMpnp_)g-V~KQRp(0RJt@xQU+*~3O?RZB^=S$3Lj}xlZTm-naKFUH84iP zcr$Q2Vn2s~4-af&{1|^GfI}~H=oE)e^D>eI(m3|o+3*!LI6*G&ozG{v3uG-fxASQZ zfImK6V{Dg_p5aOgyzGvBRbjDr3fGUBP*l8`31h;UNsNq%;Ls}^I>e!)96H9Kk6c%Z zm}n-RpLz@v%K*h+<JHLT6L6C07#U{Djmmu&i*P!H(q}|lgH$92xR;n4!z6w7m_xKIn(}ZHpR@G@t~D6 z6-*_EKta6EL5f^;RPMK9)^~`hBRrUTrh(6*h8TdU#G9Pg>@0zXNJ>OA(`Wp((q|8_ z;)#;rkkIIuDamP>!{vb7+&w0EdO=B-VI&I`Um#URWru)LbFbZOb5zoyYRh|DTHuJ? z+yfbVN$#?U$S8PT zZdqc6QQP#Lrgj_r=9O8LGFDi;x2J@!?*j=C3Hj#Eg=V<(Y$`VQn&EQiJVyYe4ax~A z)ZLw}hhpR6<>OVX86J8tezL1v&EcsE_k_eGm`!zu#cqZ*I%ZYQ*CtXY5fTc!1Gtn_ z=X3{CCd2RajIos+()ov3a7n>u6pmU2>jNp__SP% z2r*Pw3MQhU1YHUgp3^~boHMKX^Uxp~H`08X2R(l|Kc+C(|Z))I`hxJoCStLetDx zAj1tbNh@P!;+S@(!=X=LZ+9G23Wvbnow$#gOPpXjnfXv%;sl32#d#e1j6WXhvZtvqQ7oTGGCoP3Y8?cjHACCUM2(g z@CKov6<@|mgssA}Yf;y0t#t{<04-QhrZ;{*Bttm zL*F|t`~3iFexw`&bGzU-fAwz(HH z+%O}vO@RC3|Gzypa_{ipb9+pPhBEgvyCENed4PG4d5GD`Jj^`8KoIRG4*krb^Bnqx zL%(w90*8Lv!aT}6#yn0;WFF#EusH;AoIf~{z#?b}nQxG4%crdgcmMT&y(HXBzLT@g z-I%0)V@ir9BTbv0qR7sMZE~7c4|`gzK1-36qETn-b!v@{FO)Z?&e(rh)yvn@ByiVzugM^+r z#2ltdI1+IrIa17# zZX7w0Bd2m?8vh`jBQtojaM?0%&N^$ZB%jfR)&BV^aAQa@hL+%dTwL-E^f!>6Psnj) z`|u0|-Slv)g5U8Q;FMsLVjJezGYs757V3#GUvZ@S@OF{;7SulT9rHa$dT^xYh==|o z^YiFbBlJG=3tq*M6Zk3#INxEeohJBq7L9GnQhZadOA9KnEb9SIDJy2(Sa*(;aHKa! z`fOq+z!NWy^mROnZ){hN`yj9kp zEN25*DI3HFvmtCK8^%F3ft?)b&yfKf8OV`Rjs)Hb=E#t3L?kO?BUq4LHkyrrzfe|( zBSSe7I)(FJCvl{V|BT=#&a?V|P!_9Xq(XrsvM5w(WK%~H<=Bi--?K-O>DU>gp65Eg z4>JU-W(&Y4V>PUn)vMS;(tIwwNv9u_x!XAxBQ; zNGO{JjyT{E2YK*sjr1N9oueUgst9Qn#vUw1Bd9cF~xo zC2Su)&ymS|)1`aIG+o9*L4uKTNmMO+CBDFsseIG1`GoAXEYvz296z6M+F!{Bbnc_a zChR(qaua(uFR3@Px3Fv2TiM&#+u1wVJK4K9GLs{-I5L|fr*Y(Tj-0`fIUG5YBXhR_ zH?4zk(rjWjdoR0@9bgA}mQq3hsTdb?WGzQpII^1~dw34}-(RNk(i)V&=l`g5<)vjR z*$3I3z%T4W9H|;$ALd9kznmB$spzj2s$?H!ALl_l#*vxiZ?Rt! zvpKSyBWL3|99i@)S2JY4hhk9dS@s9^M~(!{lyYR5tGWcN4+Rj^juJM>cY#kt3V_Jhtir^pVmOx^ z5T|iu^T0nWbtj%Cp5e3tVo+$U!&X471P@KD6014V%#rOb10dFk^GB;{R3V;)=W}Em zud4fGqqVxYSX?%yX_L5|CrAh1bn(G4O{>MVu2}%V<~nC#;Ahb&21L)}$oV6)Xcn8t zfLBz4!)> zv~y%HM=l&+gq@{W#u3^(1fgB@PYCUps&3+YN2B(Wzi1GP+TyV&W1zmBD#V$(rs{{+f6Tk^V=m*SpN$8O8RPg2mKs< znmz|5@>wX4?*XOpC&E#JFB1vj`B)|%V)0X8II%PwQDWN%<^Wbfup6Z;61ntzPl1LfwQVxM96vd^(^v+qLD`48BS*yHR8 z_A@9ye}?^v{f7NbED_7awc<|kI`LNVlj4`fN5v<^=fppYe-U30|L#V(k!~V4#!c)N z;uhvM$t}Vy$}Pq%&Q0z%#ZBRs=%#k7ceA)*w;S9B++J{d$L)mMw{BIPcZ>Tx_dDGma^LTM(EYIcTkdbW zf9ihL{YUqo+|RrJ>i(PiA0Eg<;^E`r=Mmr`^$7L|^$7Qnc_=)xJt{mpJg)W_^mx$Y z1&=p9j(NQA@uA1Z9-nx8;qjHnHy+=4ob~u|f@DJG1l@%B6BbUmdcsW;?wYW9!uAQz zPB=8-_=F!kC7wQ>ex3oIQqN$|BF{?C2G2&%CeLQiR?h{VOFggjyxQ|x&y}7VJqJB^ zc)slUhUeFwzk2@W`G*(sV!hnF0=%SN!Cs+WiC)QGGreYcRd`i-)p*r;ZSuO`>p8Fe zULSa!oaj9+ zK2<&jpSeEsd^&x)eENNs`(U4|e6I0X;j_+X$Y-0+4xa~n9`bq0XP?jWJ}>&b?DMM6 z>plm4j`^JM`PS!0pPzir`~2=p_>#UN-vHl9zDd41U!(65-=)6GeX;MAzUzF4e0TUh z?t9Glr0*%;GrnK?e(gv3(SEF-o1cfDr(b|ynBOG72)`)57{3(1G`|eLEI*xJo?n4q zp%Z6kfd5hd z_xwNb|H%JS|C9cw{LlEG4Il#C0z3jd111J|2LuO%280L50wM#V1M&je0+s}<4cHQ} zJK(W^Jpq3Ucq-tTfV}~)1-udPX29Wqw*uY{csJm^fbRn%0+oTSfwsVF0@noI9(ZTq z+Q9XJ8v=I*J{`C>@VUSj1NR3W2z)>Abl|sv-v|B>crNg_z(1r&N=a!cBb_J>l}?gI zNTa2((s*gQG((yx&6bu*4bmoQv(zkYms+F?rG3(V>2fKSUMamvx<-1N^iJvB(sk0U z(jC$Vq&uaLNOw#3Nne*9lpc~Eksg)4BRwYlTzXpih4d@wH`4ELMt_U^- zcLsL__XJym?ZFF!x!|jUuL)ied|mJj!K;EF4L%*>9ugE184?#F51A682vLUAgqT8F zL)t<*LY9SG5yFLB6>?3;ijXHmUI=+Dv^v-ta}?ec`LZ?+jlbzBT;e@ZI5$h3^SJ9{%$r z&q)!J(kA6iYM9hB$vVkCY2l>Bla@?+X43vi$0wbVkus?)LKZEHmBq`_Wiw?;nOdfm z>18FdGFiE-QdTXil{L%EvUZt8wnlcF><-yovbD1HvX5n_WoKkxMu;L}BXT01h+7LAmH59caYJ1cJQBOrZ6SXhu zg{b{eFGsx=buj8s)ahs@+BbS~v?01X`ugZQqc=nkL=Q!8iGDEp;ppAbk4HZdeKsaE zMjuliQx#Ji(-32fF~xMn^u$`{;%ulg# zv2$X%*oR^d#2$@(H}<{Q4`YwVo{0T2_Pf|0Vt>L99d}*ajd3@{-4eGZZe83^+?KfQarehP9k)O3<+#`44#pjh4~>tB zPl?ZrpBA4Jua4Kn=f}^ApA%mj-x+^x{7vx>#XlB*H2%x@^YOpL{~G_B++Ch1Pm!m~ zv*gp|Gvz9|R-PxHC7&%Xm6yw_>2a1mrpCrf=G7_>9rX}Pgu20;SxFhj_#GTpqWN**D zKl{P#ho^lq?VD-eO*=d7+>F^X>Si>|Xq;i1v316yGajGu#EhqMB61RPl5$dV(sORe zxhrRF&ib5tb57;_nDbN4`J4+gl{070ESXt0vts7jnOkOVo4I4=gEN26^~m+h4ak+| z2Iq$6#^lE5PRUi|CgrB&PS4HDEzLFLw&hxKJ9E2pt-1ZV%X7Kht8%Z+U75Qn_vPGo zl!Vev>8lJ=PFAKW)0LUZY~^&NR+*=qr7TjGD9e;}$~NVEl-DV5P~N7z zQ@K{TUU{!_K)GGHOZk-Yfbx*?i1MiN9py3Q3FS%UY2_Enua(~_&#NevmnuXRt%_B} zt0t?as?t?is_Cj6l~Scv6{;##jjDMnyK13ov1*BGsp=ZlO4SXjRjQj+YgFr0TUEPM zdsPQiuc%&Ay`g$jbxiev>SNU>s?SuPtG-qJrWULH)#2(0b+kH8Jz1Tq&QNEor>keG zmFfa@xw=7ZQCro$>c#4Q^>XzJ_4Vpi>YLPS)VHbcQEyl8R_{~4tbSGfy858{korCK zhw9_%6Y7)dQ|j;3ziLDpZ%wc!R1>a|X(BaKGzpqyO{ykClciB^f8?K184 z+FP|7wcE7!Yah}+qJ32RjCP;)1?@}P1KL-#N3S)A{K9by8i3 zE?g(mDRhatWL=uhqFbn2tXra6rh7#9tZtv~dEHC8U-e?WyMBUxqF$>n(^u%L^>uoK z-l*@_U#(xEzg~Z%en7ul|BQa0{(1ci`u+Ns^>6FH(EpxC$N zrLe8gQrJ^yD_mIESJ+=TRCuWH_ae5)t0={w`g%uf6?-yYl>DD-B7f;=;orki`ExCRP$&!+lB{!AaQL?FIXUVRT$4Z_kd8*{ulIKd^C^=Meq~z_AV59^uOYbTjC><(&pmcZX6Q!?~zFvB~^i1hDrQemFE&Z|d_cGtI zfU=;n(6UKok!3Mu@nuuW63UXxQp=QO>N0IvUfHU$wPoweHk1vNeOC5;*$-vs%FfRz znbR<*aZb~mmN{GI?4I-3oIP`%te8*{R1se>r6QpsxgxD1vtn9BPDN2gNyVIs%8KfW zx{8L1#)_tj?uuJ0j#N^WF_o&yhRQ{ixbmvXYb#e)-d?%A@`1{omAfh*tK3uhWaZP9 zdn=!>e6jLa<@=Q%RvxeXwDR-HGnHReepC5<<&Tv=RY|I%suHV=RjaE8s&-aAQ}s&K z>s1G<4p$wmdZ+4m)yb;URbN(pUG-}>Uq^&)eEX^)wfn}seZBgQ1xfkr>f6Xe^vc$_1Wrk)#s}( zRR2-qQ{z_?SQA_mRx_z4vL>b`u4Z!0)SA4S`kL;V#nob+3S|oU0t`L?)th_ zbvMTj>VtA1VmhWdf}q53WL+v}gM zf42U)`WNb7s{ecaEA_9}zgd5z{%HN_2C_lY5Z92>kl)bIa7DxQ4RsRO94EMPpK9YGZn%x>47d*I3Y4-PqdL*4WWFw{cP9 zlE$Tt%NuWL+|W4CxT$e-4B!5O^-A^+4T3O z*P7mFdb8qP?HGR-@vgvHoxu&0+er@{QM3~%6UM6popDDl;Wr{aVHcd4pn^H{~ zrYw`nRBS3YRhp_z4W>qu$<$)%H1(O5nEFl2Osh?|m~J)QVY + + + + + + + + diff --git a/SwiftRSS_Example.xcodeproj/xcuserdata/shripada.xcuserdatad/xcschemes/xcschememanagement.plist b/SwiftRSS_Example.xcodeproj/xcuserdata/shripada.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..9550d3a --- /dev/null +++ b/SwiftRSS_Example.xcodeproj/xcuserdata/shripada.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,19 @@ + + + + + SuppressBuildableAutocreation + + 114E26BD19BA399B00D292F3 + + primary + + + 119025D519B92DA1009184BE + + primary + + + + + diff --git a/SwiftRSS_Example/AppDelegate.swift b/SwiftRSS_Example/AppDelegate.swift index d5a6913..211e936 100644 --- a/SwiftRSS_Example/AppDelegate.swift +++ b/SwiftRSS_Example/AppDelegate.swift @@ -16,9 +16,9 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. - let splitViewController = self.window!.rootViewController as UISplitViewController - let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as UINavigationController - navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem() + let splitViewController = self.window!.rootViewController as! UISplitViewController + let navigationController = splitViewController.viewControllers[splitViewController.viewControllers.count-1] as! UINavigationController + navigationController.topViewController!.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem() splitViewController.delegate = self return true } @@ -47,7 +47,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UISplitViewControllerDele // MARK: - Split view - func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController:UIViewController!, ontoPrimaryViewController primaryViewController:UIViewController!) -> Bool { + func splitViewController(splitViewController: UISplitViewController, collapseSecondaryViewController secondaryViewController:UIViewController, ontoPrimaryViewController primaryViewController:UIViewController) -> Bool { if let secondaryAsNavController = secondaryViewController as? UINavigationController { if let topAsDetailController = secondaryAsNavController.topViewController as? DetailViewController { if topAsDetailController.detailItem == nil { diff --git a/SwiftRSS_Example/DetailViewController.swift b/SwiftRSS_Example/DetailViewController.swift index c4a04a4..1f19005 100644 --- a/SwiftRSS_Example/DetailViewController.swift +++ b/SwiftRSS_Example/DetailViewController.swift @@ -25,26 +25,29 @@ class DetailViewController: UIViewController { { if let webView = self.itemWebView { - - if let templateURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("template", ofType: "html")!)? + let templateURLP = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("template", ofType: "html")!) + + let templateURL : NSURL? = templateURLP + + if (templateURL != nil) { - if var template = NSString(contentsOfURL: templateURL, encoding: NSUTF8StringEncoding, error: nil)? - { - if let title = item.title? + var template = try! NSString(contentsOfURL: templateURL!, encoding: NSUTF8StringEncoding) + + if let title = item.title { template = template.stringByReplacingOccurrencesOfString("###TITLE###", withString: title) } - if let content = item.content? + if let content = item.content { template = template.stringByReplacingOccurrencesOfString("###CONTENT###", withString: content) } - else if let description = item.itemDescription? + else if let description = item.itemDescription { template = template.stringByReplacingOccurrencesOfString("###CONTENT###", withString: description) } - if let date = item.pubDate? + if let date = item.pubDate { var formatter = NSDateFormatter() formatter.dateFormat = "MMM dd, yyyy" @@ -52,17 +55,17 @@ class DetailViewController: UIViewController { template = template.stringByReplacingOccurrencesOfString("###DATE###", withString: formatter.stringFromDate(date)) } - webView.loadHTMLString(template, baseURL: nil) - } + webView.loadHTMLString(template as String, baseURL: nil) + } else { - if let content = item.content? + if let content = item.content { webView.loadHTMLString(content, baseURL: nil) } - else if let description = item.itemDescription? + else if let description = item.itemDescription { webView.loadHTMLString(description, baseURL: nil) } diff --git a/SwiftRSS_Example/MasterViewController.swift b/SwiftRSS_Example/MasterViewController.swift index 74513d7..2669486 100644 --- a/SwiftRSS_Example/MasterViewController.swift +++ b/SwiftRSS_Example/MasterViewController.swift @@ -28,15 +28,16 @@ class MasterViewController: UITableViewController { if let split = self.splitViewController { let controllers = split.viewControllers - self.detailViewController = controllers[controllers.count-1].topViewController as? DetailViewController + + self.detailViewController = controllers[controllers.count-1] as? DetailViewController } let request = NSURLRequest(URL: NSURL(string: "http://developer.apple.com/swift/blog/news.rss")!) RSSParser.parseFeedForRequest(request, callback: { (feed, error) -> Void in - if let myFeed = feed? + if let myFeed = feed { - if let title = myFeed.title? + if let title = myFeed.title { self.title = title } @@ -56,12 +57,12 @@ class MasterViewController: UITableViewController { override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if segue.identifier == "showDetail" { - if let indexPath = self.tableView.indexPathForSelectedRow() { + if let indexPath = self.tableView.indexPathForSelectedRow { - if let feed = self.feed? + if let feed = self.feed { let item = feed.items[indexPath.row] as RSSItem - let controller = (segue.destinationViewController as UINavigationController).topViewController as DetailViewController + let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController controller.detailItem = item controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem() controller.navigationItem.leftItemsSupplementBackButton = true @@ -78,7 +79,7 @@ class MasterViewController: UITableViewController { override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { - if let feed = self.feed? + if let feed = self.feed { return feed.items.count } @@ -89,11 +90,11 @@ class MasterViewController: UITableViewController { override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell - if let feed = self.feed? + if let feed = self.feed { let item = feed.items[indexPath.row] as RSSItem - cell.textLabel.text = item.title + cell.textLabel!.text = item.title } return cell diff --git a/Tests/NSDate+dateFromInternetDateTimeString_Tests.swift b/Tests/NSDate+dateFromInternetDateTimeString_Tests.swift index fdfd29a..c3470ae 100644 --- a/Tests/NSDate+dateFromInternetDateTimeString_Tests.swift +++ b/Tests/NSDate+dateFromInternetDateTimeString_Tests.swift @@ -13,7 +13,7 @@ class NSDateExtension_Tests: XCTestCase { let GMT_timeZone: NSTimeZone! = NSTimeZone(forSecondsFromGMT: 0) let calendar: NSCalendar! = NSCalendar(calendarIdentifier: NSGregorianCalendar) - let calendar_flags = NSCalendarUnit(UInt.max) + let calendar_flags = NSCalendarUnit(rawValue: UInt.max) override func setUp() { super.setUp() @@ -30,7 +30,7 @@ class NSDateExtension_Tests: XCTestCase { let dateString = "Sun, 19 May 2002 15:21:36 GMT" - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) @@ -53,7 +53,7 @@ class NSDateExtension_Tests: XCTestCase { let dateString = "Sun, 19 May 2002 15:21 GMT" - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) @@ -76,7 +76,7 @@ class NSDateExtension_Tests: XCTestCase { let dateString = "Sun, 19 May 2002 15:21:36" - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) @@ -98,7 +98,7 @@ class NSDateExtension_Tests: XCTestCase { let dateString = "Sun, 19 May 2002 15:21" - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) @@ -120,7 +120,7 @@ class NSDateExtension_Tests: XCTestCase { let dateString = "19 May 2002 15:21:36 GMT" - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) @@ -142,7 +142,7 @@ class NSDateExtension_Tests: XCTestCase { let dateString = "19 May 2002 15:21 GMT" - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) @@ -164,7 +164,7 @@ class NSDateExtension_Tests: XCTestCase { let dateString = "19 May 2002 15:21:36" - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) @@ -185,7 +185,7 @@ class NSDateExtension_Tests: XCTestCase { let dateString = "19 May 2002 15:21" - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) @@ -210,7 +210,7 @@ class NSDateExtension_Tests: XCTestCase { let timeZone = NSTimeZone(forSecondsFromGMT: -60*60*8) calendar.timeZone = timeZone - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) @@ -234,7 +234,7 @@ class NSDateExtension_Tests: XCTestCase { let timeZone = NSTimeZone(forSecondsFromGMT: 60*60*2) calendar.timeZone = timeZone - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) @@ -257,7 +257,7 @@ class NSDateExtension_Tests: XCTestCase { let dateString = "1937-01-01T12:00:27" - if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString)? + if let date: NSDate = NSDate.dateFromInternetDateTimeString(dateString) { var dateComponent = calendar.components(calendar_flags, fromDate: date) diff --git a/Tests/RSSFeed_Tests.swift b/Tests/RSSFeed_Tests.swift index 9cdb6a0..aae6003 100644 --- a/Tests/RSSFeed_Tests.swift +++ b/Tests/RSSFeed_Tests.swift @@ -23,10 +23,10 @@ class RSSFeed_Tests: XCTestCase { func test_setLink_withAValidURLString_shouldCreateAValidURL() { - var item: RSSItem = RSSItem() - item.setLink("http://www.apple.com") + let item: RSSItem = RSSItem() + item.setLinkAsString("http://www.apple.com") - if let link = item.link? + if let link = item.link { XCTAssert(true, "link is valid") } @@ -42,7 +42,7 @@ class RSSFeed_Tests: XCTestCase { var feed: RSSFeed = RSSFeed() feed.title = "Feed title" - feed.setLink("http://www.swift.io") + feed.setLinkAsString("http://www.swift.io") feed.feedDescription = "Description of the feed" feed.language = "fr" feed.lastBuildDate = NSDate() @@ -52,13 +52,13 @@ class RSSFeed_Tests: XCTestCase { var item: RSSItem = RSSItem() item.title = "Hello" - item.setLink("http://www.apple.com") + item.setLinkAsString("http://www.apple.com") item.guid = "1234" item.pubDate = NSDate() item.itemDescription = "Big Description" item.content = "Here is the content" - item.setCommentsLink("http://www.test.com") - item.setCommentRSSLink("http://www.whatever.com/") + item.setCommentsLinkAsString("http://www.test.com") + item.setCommentRSSLinkAsString("http://www.whatever.com/") item.commentsCount = 666 item.author = "John Doe" item.categories = ["One","Two","Tree"] @@ -68,13 +68,13 @@ class RSSFeed_Tests: XCTestCase { var item2: RSSItem = RSSItem() item2.title = "Hello2" - item2.setLink("http://www.google.com") + item2.setLinkAsString("http://www.google.com") item2.guid = "5678" item2.pubDate = NSDate() item2.itemDescription = "Big Description Again" item2.content = "Here is the content for the second item" - item2.setCommentsLink("http://www.testing.com") - item2.setCommentRSSLink("http://www.whateveragain.com/") + item2.setCommentsLinkAsString("http://www.testing.com") + item2.setCommentRSSLinkAsString("http://www.whateveragain.com/") item2.commentsCount = 42 item2.author = "Jane Doe" item2.categories = ["Four","Five","Six"] @@ -85,7 +85,7 @@ class RSSFeed_Tests: XCTestCase { NSKeyedArchiver.archiveRootObject(feed, toFile: archive) - var feed2 = NSKeyedUnarchiver.unarchiveObjectWithFile(archive) as RSSFeed + var feed2 = NSKeyedUnarchiver.unarchiveObjectWithFile(archive) as! RSSFeed XCTAssert(feed.title == feed2.title, "") XCTAssert(feed.link == feed2.link, "") diff --git a/Tests/RSSItem_Tests.swift b/Tests/RSSItem_Tests.swift index e967c33..e30648b 100644 --- a/Tests/RSSItem_Tests.swift +++ b/Tests/RSSItem_Tests.swift @@ -23,10 +23,10 @@ class RSSItem_Tests: XCTestCase { func test_setLink_withAValidURLString_shouldCreateAValidURL() { - var item: RSSItem = RSSItem() - item.setLink("http://www.apple.com") + let item: RSSItem = RSSItem() + item.setLinkAsString("http://www.apple.com") - if let link = item.link? + if let link = item.link { XCTAssert(true, "link is valid") } @@ -42,13 +42,13 @@ class RSSItem_Tests: XCTestCase { var item: RSSItem = RSSItem() item.title = "Hello" - item.setLink("http://www.apple.com") + item.setLinkAsString("http://www.apple.com") item.guid = "1234" item.pubDate = NSDate() item.itemDescription = "Big Description" item.content = "Here is the content" - item.setCommentsLink("http://www.test.com") - item.setCommentRSSLink("http://www.whatever.com/") + item.setCommentsLinkAsString("http://www.test.com") + item.setCommentRSSLinkAsString("http://www.whatever.com/") item.commentsCount = 666 item.author = "John Doe" item.categories = ["One","Two","Tree"] @@ -57,7 +57,7 @@ class RSSItem_Tests: XCTestCase { NSKeyedArchiver.archiveRootObject(item, toFile: archive) - var item2 = NSKeyedUnarchiver.unarchiveObjectWithFile(archive) as RSSItem + var item2 = NSKeyedUnarchiver.unarchiveObjectWithFile(archive) as! RSSItem XCTAssert(item.title == item2.title, "") XCTAssert(item.link == item2.link, "") diff --git a/Tests/RSSParser_Tests.swift b/Tests/RSSParser_Tests.swift index b2532c3..e71b7ff 100644 --- a/Tests/RSSParser_Tests.swift +++ b/Tests/RSSParser_Tests.swift @@ -21,7 +21,7 @@ class RSSParser_Tests: XCTestCase { let GMT_timeZone: NSTimeZone! = NSTimeZone(name: "GMT") let DST_timeZone: NSTimeZone! = NSTimeZone(forSecondsFromGMT: 60 * 60 * -4) let calendar: NSCalendar! = NSCalendar(calendarIdentifier: NSGregorianCalendar) - let calendar_flags = NSCalendarUnit(UInt.max) + let calendar_flags = NSCalendarUnit(rawValue: UInt.max) override func setUp() { super.setUp() @@ -33,7 +33,7 @@ class RSSParser_Tests: XCTestCase { func test_parser_withValidMock_shouldReturnTheRightValues() { - let request: NSURLRequest = NSURLRequest(URL: NSURL(fileURLWithPath: mockFileURL!)!) + let request: NSURLRequest = NSURLRequest(URL: NSURL(fileURLWithPath: mockFileURL!)) let expectation = self.expectationWithDescription("GET \(request.URL)") RSSParser.parseFeedForRequest(request, callback: { (feed, error) -> Void in @@ -44,10 +44,10 @@ class RSSParser_Tests: XCTestCase { XCTAssertNil(error, "error should be nil") - if let testFeed = feed? + if let testFeed = feed { XCTAssert(testFeed.title == "Swift Blog - Apple Developer", "") - if let link = testFeed.link? + if let link = testFeed.link { XCTAssert(link.absoluteString == "http://developer.apple.com/swift/blog/", "") } @@ -55,7 +55,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(testFeed.language == "en-US", "") - if let date = testFeed.lastBuildDate? + if let date = testFeed.lastBuildDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -82,7 +82,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.title == "Building assert() in Swift, Part 2: __FILE__ and __LINE__ ", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://developer.apple.com/swift/blog/?id=15", "") } @@ -93,7 +93,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://developer.apple.com/swift/blog/?id=15", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -118,7 +118,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.title == "Swift Has Reached 1.0", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://developer.apple.com/swift/blog/?id=14", "") } @@ -129,7 +129,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://developer.apple.com/swift/blog/?id=14", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -154,7 +154,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.title == "Patterns Playground", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://developer.apple.com/swift/blog/?id=13", "") } @@ -165,7 +165,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://developer.apple.com/swift/blog/?id=13", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -190,7 +190,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.title == "Optionals Case Study: valuesForKeys ", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://developer.apple.com/swift/blog/?id=12", "") } @@ -201,7 +201,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://developer.apple.com/swift/blog/?id=12", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -226,7 +226,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.title == "Access Control and protected ", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://developer.apple.com/swift/blog/?id=11", "") } @@ -237,7 +237,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://developer.apple.com/swift/blog/?id=11", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -262,7 +262,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.title == "Value and Reference Types", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://developer.apple.com/swift/blog/?id=10", "") } @@ -273,7 +273,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://developer.apple.com/swift/blog/?id=10", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -297,8 +297,8 @@ class RSSParser_Tests: XCTestCase { myItem = testFeed.items[6] XCTAssert(myItem.title == "Balloons", "") - - if let link = myItem.link? + + if let link = myItem.link { XCTAssert(link.absoluteString == "http://developer.apple.com/swift/blog/?id=9", "") } @@ -309,7 +309,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://developer.apple.com/swift/blog/?id=9", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -362,7 +362,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.title == "Welcome to Swift Blog", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://developer.apple.com/swift/blog/?id=1", "") } @@ -373,7 +373,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://developer.apple.com/swift/blog/?id=1", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -403,7 +403,7 @@ class RSSParser_Tests: XCTestCase { func test_parser_withWordpressMock_shouldReturnTheRightValues() { - let request: NSURLRequest = NSURLRequest(URL: NSURL(fileURLWithPath: wordpressMockFileURL!)!) + let request: NSURLRequest = NSURLRequest(URL: NSURL(fileURLWithPath: wordpressMockFileURL!)) let expectation = self.expectationWithDescription("GET \(request.URL)") RSSParser.parseFeedForRequest(request, callback: { (feed, error) -> Void in @@ -415,12 +415,12 @@ class RSSParser_Tests: XCTestCase { XCTAssertNil(error, "error should be nil") - if let testFeed = feed? + if let testFeed = feed { XCTAssertTrue(testFeed.items.count == 10, "should have 10 items") XCTAssert(testFeed.title == "WordPress.com News", "") - if let link = testFeed.link? + if let link = testFeed.link { XCTAssert(link.absoluteString == "http://en.blog.wordpress.com", "") } @@ -428,7 +428,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(testFeed.language == "en", "") - if let date = testFeed.lastBuildDate? + if let date = testFeed.lastBuildDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -453,7 +453,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.title == "Engaged, Inspired, and Ready to Build a Better Web", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://en.blog.wordpress.com/2014/09/30/grand-meetup-reflections/", "") } @@ -464,7 +464,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://en.blog.wordpress.com/?p=28737", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -488,7 +488,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.imagesFromItemDescription.count == 1, "") XCTAssert(myItem.imagesFromItemDescription[0].absoluteString == "http://pixel.wp.com/b.gif", "") - if let link = myItem.commentsLink? + if let link = myItem.commentsLink { XCTAssert(link.absoluteString == "http://en.blog.wordpress.com/2014/09/30/grand-meetup-reflections/#comments", "") } @@ -497,7 +497,7 @@ class RSSParser_Tests: XCTestCase { XCTFail("link shouldn't be nil") } - if let link = myItem.commentRSSLink? + if let link = myItem.commentRSSLink { XCTAssert(link.absoluteString == "http://en.blog.wordpress.com/2014/09/30/grand-meetup-reflections/feed/", "") } @@ -510,16 +510,16 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.author == "Michelle W.", "") - XCTAssert(contains(myItem.categories, "Automattic"),"") - XCTAssert(contains(myItem.categories, "Hiring"),"") - XCTAssert(contains(myItem.categories, "distributed work"),"") - XCTAssert(contains(myItem.categories, "future of work"),"") + XCTAssert(myItem.categories.contains("Automattic"),"") + XCTAssert(myItem.categories.contains("Hiring"),"") + XCTAssert(myItem.categories.contains("distributed work"),"") + XCTAssert(myItem.categories.contains("future of work"),"") myItem = testFeed.items[6] XCTAssert(myItem.title == "Gmail Password Leak Update", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://en.blog.wordpress.com/2014/09/12/gmail-password-leak-update/", "") } @@ -530,7 +530,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://en.blog.wordpress.com/?p=28615", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -554,7 +554,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.imagesFromItemDescription.count == 1, "") XCTAssert(myItem.imagesFromItemDescription[0].absoluteString == "http://pixel.wp.com/b.gif", "") - if let link = myItem.commentsLink? + if let link = myItem.commentsLink { XCTAssert(link.absoluteString == "http://en.blog.wordpress.com/2014/09/12/gmail-password-leak-update/#comments", "") } @@ -563,7 +563,7 @@ class RSSParser_Tests: XCTestCase { XCTFail("link shouldn't be nil") } - if let link = myItem.commentRSSLink? + if let link = myItem.commentRSSLink { XCTAssert(link.absoluteString == "http://en.blog.wordpress.com/2014/09/12/gmail-password-leak-update/feed/", "") } @@ -576,9 +576,9 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.author == "Daryl L. L. Houston", "") - XCTAssert(contains(myItem.categories, "Notifications"),"") - XCTAssert(contains(myItem.categories, "Security"),"") - XCTAssert(contains(myItem.categories, "security"),"") + XCTAssert(myItem.categories.contains("Notifications"),"") + XCTAssert(myItem.categories.contains("Security"),"") + XCTAssert(myItem.categories.contains("security"),"") myItem = testFeed.items[2] @@ -604,7 +604,7 @@ class RSSParser_Tests: XCTestCase { func test_parser_withTumblrMock_shouldReturnTheRightValues() { - let request: NSURLRequest = NSURLRequest(URL: NSURL(fileURLWithPath: tumblrMockFileURL!)!) + let request: NSURLRequest = NSURLRequest(URL: NSURL(fileURLWithPath: tumblrMockFileURL!)) let expectation = self.expectationWithDescription("GET \(request.URL)") RSSParser.parseFeedForRequest(request, callback: { (feed, error) -> Void in @@ -615,12 +615,12 @@ class RSSParser_Tests: XCTestCase { XCTAssertNil(error, "error should be nil") - if let testFeed = feed? + if let testFeed = feed { XCTAssertTrue(testFeed.items.count == 20, "should have 20 items") XCTAssert(testFeed.title == "Tumblr Engineering", "") - if let link = testFeed.link? + if let link = testFeed.link { XCTAssert(link.absoluteString == "http://engineering.tumblr.com/", "") } @@ -632,7 +632,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.title == "Sam Giddins: My Summer at TumblrThis summer, I had the immense...", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://engineering.tumblr.com/post/98331642904", "") } @@ -643,7 +643,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://engineering.tumblr.com/post/98331642904", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -670,7 +670,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.title == "Megan Belzner: My Summer at TumblrThis summer I got the amazing...", "") - if let link = myItem.link? + if let link = myItem.link { XCTAssert(link.absoluteString == "http://engineering.tumblr.com/post/98050002584", "") } @@ -681,7 +681,7 @@ class RSSParser_Tests: XCTestCase { XCTAssert(myItem.guid == "http://engineering.tumblr.com/post/98050002584", "") - if let date = myItem.pubDate? + if let date = myItem.pubDate { var dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) @@ -715,7 +715,7 @@ class RSSParser_Tests: XCTestCase { func test_parser_withInvalidMock_shouldReturnParsingError() { - let request: NSURLRequest = NSURLRequest(URL: NSURL(fileURLWithPath: invalidMockFileURL!)!) + let request: NSURLRequest = NSURLRequest(URL: NSURL(fileURLWithPath: invalidMockFileURL!)) let expectation = self.expectationWithDescription("GET \(request.URL)") RSSParser.parseFeedForRequest(request, callback: { (feed, error) -> Void in @@ -753,7 +753,7 @@ class RSSParser_Tests: XCTestCase { func test_parser_withEmptyMock_shouldBehaveProperly() { - let request: NSURLRequest = NSURLRequest(URL: NSURL(fileURLWithPath: emptyMockFileURL!)!) + let request: NSURLRequest = NSURLRequest(URL: NSURL(fileURLWithPath: emptyMockFileURL!)) let expectation = self.expectationWithDescription("GET \(request.URL)") RSSParser.parseFeedForRequest(request, callback: { (feed, error) -> Void in