diff --git a/README.md b/README.md index 40083ae..8c79a25 100644 --- a/README.md +++ b/README.md @@ -12,15 +12,17 @@ SwiftRSS is a simple RSS parser written in Swift. - [x] Handle Comment link, feed and count (specific to Wordpress) - [x] Add images helper (an array of images URL like for BlockRSSParser) - [x] Continuous integration -- [ ] Cocoapods spec (waiting for Cocoapods Swift support) +- [x] Cocoapods spec ## Installation -The project will be available as a Pod as soon as Cocoapods will release the Swift support. +- Using [CocoaPods](https://cocoapods.org/?q=swiftrss), just add this line to your Podfile: -For now you can install this module manualy : Copy the content of the SwiftRSS folder and add it to your project. +`pod 'SwiftRSS', '~> 0.0'` -You can also use this project as Git [submodule](http://git-scm.com/docs/git-submodule). +- Installing this module manualy : Copy the content of the SwiftRSS folder and add it to your project. + +- You can also use this project as Git [submodule](http://git-scm.com/docs/git-submodule). ## Usage diff --git a/SwiftRSS/NSDate+dateFromInternetDateTimeString.swift b/SwiftRSS/NSDate+dateFromInternetDateTimeString.swift old mode 100644 new mode 100755 index 8d96808..1c01572 --- 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 old mode 100644 new mode 100755 index 30d20c1..f30a982 --- a/SwiftRSS/RSSFeed.swift +++ b/SwiftRSS/RSSFeed.swift @@ -8,38 +8,38 @@ import UIKit -class RSSFeed: NSObject, NSCoding { +public class RSSFeed: NSObject, NSCoding { - var items: [RSSItem]! = [RSSItem]() + public var items: [RSSItem]! = [RSSItem]() - var title: String? - var link: NSURL? + public var title: String? + public var link: NSURL? - func setLink(let linkString: String!) + public func setLinkAsSTring(let linkString: String!) { link = NSURL(string: linkString) } - var feedDescription: String? - var language: String? - var lastBuildDate: NSDate? + public var feedDescription: String? + public var language: String? + public var lastBuildDate: NSDate? - func setlastBuildDate(let dateString: String!) + public func setlastBuildDate(let dateString: String!) { lastBuildDate = NSDate.dateFromInternetDateTimeString(dateString) } - var generator: String? - var copyright: String? + public var generator: String? + public var copyright: String? - override init() + public override init() { super.init() } // MARK: NSCoding - required init(coder aDecoder: NSCoder) + public 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) + public 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 old mode 100644 new mode 100755 index f8915f6..d97a606 --- a/SwiftRSS/RSSItem.swift +++ b/SwiftRSS/RSSItem.swift @@ -8,49 +8,49 @@ import UIKit -class RSSItem: NSObject, NSCoding { - var title: String? - var link: NSURL? +public class RSSItem: NSObject, NSCoding { + public var title: String? + public var link: NSURL? - func setLink(let linkString: String!) + public func setLinkAsString(let linkString: String!) { link = NSURL(string: linkString) } - var guid: String? - var pubDate: NSDate? + public var guid: String? + public var pubDate: NSDate? - func setPubDate(let dateString: String!) + public func setPubDateAsString(let dateString: String!) { pubDate = NSDate.dateFromInternetDateTimeString(dateString) } - var itemDescription: String? - var content: String? + public var itemDescription: String? + public var content: String? // Wordpress specifics - var commentsLink: NSURL? + public var commentsLink: NSURL? - func setCommentsLink(let linkString: String!) + public func setCommentsLinkAsString(let linkString: String!) { commentsLink = NSURL(string: linkString) } - var commentsCount: Int? + public var commentsCount: Int? - var commentRSSLink: NSURL? + public var commentRSSLink: NSURL? - func setCommentRSSLink(let linkString: String!) + public func setCommentRSSLinkAsString(let linkString: String!) { commentRSSLink = NSURL(string: linkString) } - var author: String? + public var author: String? - var categories: [String]! = [String]() + public var categories: [String]! = [String]() - var imagesFromItemDescription: [NSURL]! { - if let itemDescription = self.itemDescription? + public var imagesFromItemDescription: [NSURL]! { + if let itemDescription = self.itemDescription { return itemDescription.imageLinksFromHTMLString } @@ -58,8 +58,8 @@ class RSSItem: NSObject, NSCoding { return [NSURL]() } - var imagesFromContent: [NSURL]! { - if let content = self.content? + public var imagesFromContent: [NSURL]! { + if let content = self.content { return content.imageLinksFromHTMLString } @@ -67,13 +67,13 @@ class RSSItem: NSObject, NSCoding { return [NSURL]() } - override init() + public override init() { super.init() } // MARK: NSCoding - required init(coder aDecoder: NSCoder) + public 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 @@ -90,54 +90,54 @@ class RSSItem: NSObject, NSCoding { categories = aDecoder.decodeObjectForKey("categories") as? [String] } - func encodeWithCoder(aCoder: NSCoder) + public 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 old mode 100644 new mode 100755 index 46f51fd..6155770 --- a/SwiftRSS/RSSParser.swift +++ b/SwiftRSS/RSSParser.swift @@ -8,9 +8,9 @@ import UIKit -class RSSParser: NSObject, NSXMLParserDelegate { +public class RSSParser: NSObject, NSXMLParserDelegate { - class func parseFeedForRequest(request: NSURLRequest, callback: (feed: RSSFeed?, error: NSError?) -> Void) + public class func parseFeedForRequest(request: NSURLRequest, callback: (feed: RSSFeed?, error: NSError?) -> Void) { let rssParser: RSSParser = RSSParser() @@ -42,7 +42,7 @@ class RSSParser: NSObject, NSXMLParserDelegate { let node_author = "dc:creator" let node_category = "category" - func parseFeedForRequest(request: NSURLRequest, callback: (feed: RSSFeed?, error: NSError?) -> Void) + public func parseFeedForRequest(request: NSURLRequest, callback: (feed: RSSFeed?, error: NSError?) -> Void) { NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue()) { (response, data, error) -> Void in @@ -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() @@ -63,19 +63,19 @@ class RSSParser: NSObject, NSXMLParserDelegate { } // MARK: NSXMLParserDelegate - func parserDidStartDocument(parser: NSXMLParser) + public func parserDidStartDocument(parser: NSXMLParser) { } - func parserDidEndDocument(parser: NSXMLParser) + public 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]) { + public func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) { if elementName == node_item { @@ -86,11 +86,11 @@ class RSSParser: NSObject, NSXMLParserDelegate { } - func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { + public func parser(parser: NSXMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { 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 @@ -196,13 +196,13 @@ class RSSParser: NSObject, NSXMLParserDelegate { } } - func parser(parser: NSXMLParser, foundCharacters string: String) { + public func parser(parser: NSXMLParser, foundCharacters string: String) { self.currentElement += string } - func parser(parser: NSXMLParser, parseErrorOccurred parseError: NSError) { + public 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 old mode 100644 new mode 100755 index 578f766..bc89db5 --- a/SwiftRSS/String+imageLinksFromHTML.swift +++ b/SwiftRSS/String+imageLinksFromHTML.swift @@ -13,21 +13,21 @@ extension String { { var matches = [NSURL]() - var error: NSError? + let full_range: NSRange = NSMakeRange(0, self.characters.count) - var full_range: NSRange = NSMakeRange(0, countElements(self)) - - 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 + let str = (self as NSString).substringWithRange(result!.range) as String matches.append(NSURL(string: str)!) } + } catch _ as NSError { + } return matches diff --git a/SwiftRSS_Example.xcodeproj/project.pbxproj b/SwiftRSS_Example.xcodeproj/project.pbxproj index d7cf803..951ad71 100644 --- a/SwiftRSS_Example.xcodeproj/project.pbxproj +++ b/SwiftRSS_Example.xcodeproj/project.pbxproj @@ -222,7 +222,9 @@ 119025CE19B92DA1009184BE /* Project object */ = { isa = PBXProject; attributes = { - LastUpgradeCheck = 0600; + LastSwiftMigration = 0720; + LastSwiftUpdateCheck = 0720; + LastUpgradeCheck = 0720; ORGANIZATIONNAME = "Thibaut LE LEVIER"; TargetAttributes = { 114E26BD19BA399B00D292F3 = { @@ -346,6 +348,7 @@ ); INFOPLIST_FILE = Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.lelevier.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftRSS_Example.app/SwiftRSS_Example"; }; @@ -360,6 +363,7 @@ ); INFOPLIST_FILE = Tests/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.lelevier.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/SwiftRSS_Example.app/SwiftRSS_Example"; }; @@ -385,6 +389,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_OPTIMIZATION_LEVEL = 0; @@ -451,6 +456,7 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; INFOPLIST_FILE = SwiftRSS_Example/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.lelevier.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Debug; @@ -462,6 +468,7 @@ ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; INFOPLIST_FILE = SwiftRSS_Example/Info.plist; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.lelevier.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; }; name = Release; diff --git a/SwiftRSS_Example.xcodeproj/xcshareddata/xcschemes/SwiftRSS_Example.xcscheme b/SwiftRSS_Example.xcodeproj/xcshareddata/xcschemes/SwiftRSS_Example.xcscheme index e34412c..129606a 100644 --- a/SwiftRSS_Example.xcodeproj/xcshareddata/xcschemes/SwiftRSS_Example.xcscheme +++ b/SwiftRSS_Example.xcodeproj/xcshareddata/xcschemes/SwiftRSS_Example.xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -76,17 +76,21 @@ ReferencedContainer = "container:SwiftRSS_Example.xcodeproj"> + + - + - + 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..7626756 100644 --- a/SwiftRSS_Example/DetailViewController.swift +++ b/SwiftRSS_Example/DetailViewController.swift @@ -25,44 +25,44 @@ class DetailViewController: UIViewController { { if let webView = self.itemWebView { + if let path = NSBundle.mainBundle().pathForResource("template", ofType: "html") { + let templateURL = NSURL(fileURLWithPath: path) - if let templateURL = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("template", ofType: "html")!)? - { - if var template = NSString(contentsOfURL: templateURL, encoding: NSUTF8StringEncoding, error: nil)? + if var template = (try? NSString(contentsOfURL: templateURL, encoding: NSUTF8StringEncoding)) { - if let title = item.title? + 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() + let formatter = NSDateFormatter() formatter.dateFormat = "MMM dd, yyyy" 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/Images.xcassets/AppIcon.appiconset/Contents.json b/SwiftRSS_Example/Images.xcassets/AppIcon.appiconset/Contents.json index 1eaab91..1d78972 100644 --- a/SwiftRSS_Example/Images.xcassets/AppIcon.appiconset/Contents.json +++ b/SwiftRSS_Example/Images.xcassets/AppIcon.appiconset/Contents.json @@ -5,6 +5,11 @@ "size" : "29x29", "scale" : "2x" }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, { "size" : "40x40", "idiom" : "iphone", @@ -56,6 +61,11 @@ "idiom" : "ipad", "size" : "76x76", "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" } ], "info" : { diff --git a/SwiftRSS_Example/Info.plist b/SwiftRSS_Example/Info.plist index 2623093..c17c898 100644 --- a/SwiftRSS_Example/Info.plist +++ b/SwiftRSS_Example/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.lelevier.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/SwiftRSS_Example/MasterViewController.swift b/SwiftRSS_Example/MasterViewController.swift index 74513d7..bca03d7 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 + let topNavigationController = controllers[controllers.count-1] as? UINavigationController + self.detailViewController = topNavigationController!.topViewController 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/Info.plist b/Tests/Info.plist index 3516498..ba72822 100644 --- a/Tests/Info.plist +++ b/Tests/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.lelevier.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Tests/NSDate+dateFromInternetDateTimeString_Tests.swift b/Tests/NSDate+dateFromInternetDateTimeString_Tests.swift index fdfd29a..0ec4270 100644 --- a/Tests/NSDate+dateFromInternetDateTimeString_Tests.swift +++ b/Tests/NSDate+dateFromInternetDateTimeString_Tests.swift @@ -12,8 +12,8 @@ import XCTest 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: NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) + let calendar_flags = NSCalendarUnit(rawValue: UInt.max) override func setUp() { super.setUp() @@ -30,9 +30,9 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 1, "") XCTAssert(dateComponent.day == 19, "") @@ -53,9 +53,9 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 1, "") XCTAssert(dateComponent.day == 19, "") @@ -76,9 +76,9 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 1, "") XCTAssert(dateComponent.day == 19, "") @@ -98,9 +98,9 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 1, "") XCTAssert(dateComponent.day == 19, "") @@ -120,9 +120,9 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.day == 19, "") XCTAssert(dateComponent.month == 5, "") @@ -142,9 +142,9 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.day == 19, "") XCTAssert(dateComponent.month == 5, "") @@ -164,9 +164,9 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.day == 19, "") XCTAssert(dateComponent.month == 5, "") @@ -185,9 +185,9 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.day == 19, "") XCTAssert(dateComponent.month == 5, "") @@ -210,9 +210,9 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.day == 19, "") XCTAssert(dateComponent.month == 12, "") @@ -234,10 +234,10 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.day == 1, "") XCTAssert(dateComponent.month == 1, "") @@ -257,9 +257,9 @@ 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) + let dateComponent = calendar.components(calendar_flags, fromDate: date) XCTAssert(dateComponent.day == 1, "") XCTAssert(dateComponent.month == 1, "") diff --git a/Tests/RSSFeed_Tests.swift b/Tests/RSSFeed_Tests.swift index 9cdb6a0..b8df96c 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 _ = item.link { XCTAssert(true, "link is valid") } @@ -39,42 +39,42 @@ class RSSFeed_Tests: XCTestCase { func test_archivingAndUnarchiving_withValidObject_shouldReturnValidObjectWithSameValues() { - var feed: RSSFeed = RSSFeed() + let 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() feed.generator = "My Generator" feed.copyright = "Copyright Acme corp" - var item: RSSItem = RSSItem() + let 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"] feed.items.append(item) - var item2: RSSItem = RSSItem() + let 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 + let feed2 = NSKeyedUnarchiver.unarchiveObjectWithFile(archive) as! RSSFeed XCTAssert(feed.title == feed2.title, "") XCTAssert(feed.link == feed2.link, "") @@ -96,7 +96,7 @@ class RSSFeed_Tests: XCTestCase { XCTAssert(feed.copyright == feed2.copyright, "") XCTAssert(feed.items.count == feed2.items.count, "") - var itemcopy = feed2.items[0] + let itemcopy = feed2.items[0] XCTAssert(item.title == itemcopy.title, "") XCTAssert(item.link == itemcopy.link, "") @@ -112,7 +112,7 @@ class RSSFeed_Tests: XCTestCase { XCTAssert(item.categories[1] == itemcopy.categories[1], "") XCTAssert(item.categories[2] == itemcopy.categories[2], "") - var item2copy = feed2.items[1] + let item2copy = feed2.items[1] XCTAssert(item2.title == item2copy.title, "") XCTAssert(item2.link == item2copy.link, "") diff --git a/Tests/RSSItem_Tests.swift b/Tests/RSSItem_Tests.swift index e967c33..94db498 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 _ = item.link { XCTAssert(true, "link is valid") } @@ -39,16 +39,16 @@ class RSSItem_Tests: XCTestCase { func test_archivingAndUnarchiving_withValidObject_shouldReturnValidObjectWithSameValues() { - var item: RSSItem = RSSItem() + let 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 + let 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..589212a 100644 --- a/Tests/RSSParser_Tests.swift +++ b/Tests/RSSParser_Tests.swift @@ -20,8 +20,8 @@ class RSSParser_Tests: XCTestCase { let PDT_timeZone: NSTimeZone! = NSTimeZone(name: "PST") 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: NSCalendar! = NSCalendar(calendarIdentifier: NSCalendarIdentifierGregorian) + 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,9 +55,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 5, "") XCTAssert(dateComponent.day == 25, "") @@ -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,9 +93,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 5, "") XCTAssert(dateComponent.day == 25, "") @@ -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,9 +129,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 3, "") XCTAssert(dateComponent.day == 9, "") @@ -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,9 +165,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 4, "") XCTAssert(dateComponent.day == 3, "") @@ -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,9 +201,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 3, "") XCTAssert(dateComponent.day == 26, "") @@ -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,9 +237,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 3, "") XCTAssert(dateComponent.day == 19, "") @@ -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,9 +273,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 6, "") XCTAssert(dateComponent.day == 15, "") @@ -298,7 +298,7 @@ class RSSParser_Tests: XCTestCase { 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,9 +309,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 6, "") XCTAssert(dateComponent.day == 8, "") @@ -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,9 +373,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 6, "") XCTAssert(dateComponent.day == 11, "") @@ -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,9 +428,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 6, "") XCTAssert(dateComponent.day == 3, "") @@ -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,9 +464,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 3, "") XCTAssert(dateComponent.day == 30, "") @@ -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,9 +530,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 6, "") XCTAssert(dateComponent.day == 12, "") @@ -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,9 +643,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 4, "") XCTAssert(dateComponent.day == 24, "") @@ -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,9 +681,9 @@ 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) + let dateComponent = self.calendar.components(self.calendar_flags, fromDate: date) XCTAssert(dateComponent.weekday == 1, "") XCTAssert(dateComponent.day == 21, "") @@ -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