SWIFT: Why is "NSURL (string:" returned with Nil, although this is a valid URL in the browser?

The first two examples of links work, the third returns NIL.

Why does NSUrl return nil for such a string, even if it is a valid URL in the browser?

Should I handle the string more?

Here is my code:

import UIKit import Foundation class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSXMLParserDelegate { var myFeed : NSArray = [] var url : NSURL! var feedURL : NSURL! var selectedFeedURL = String() @IBOutlet var tableFeeds: UITableView! @IBOutlet var webView: UIWebView! override func viewDidLoad() { super.viewDidLoad() // Set feed url. //url = NSURL(string: "http://www.skysports.com/rss/0,20514,11661,00.xml")! //This seems to work //url = NSURL(string: "http://www.formula1.com/rss/news/latest.rss")! //This seems to work url = NSURL(string: "http://www.multirotorusa.com/feed/")! loadRss(url); } func loadRss(data: NSURL) { var myParser : XmlParserManager = XmlParserManager.alloc().initWithURL(data) as XmlParserManager myFeed = myParser.feeds tableFeeds.reloadData() } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return myFeed.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as UITableViewCell var dict : NSDictionary! = myFeed.objectAtIndex(indexPath.row) as NSDictionary cell.textLabel?.text = myFeed.objectAtIndex(indexPath.row).objectForKey("title") as? String cell.detailTextLabel?.text = myFeed.objectAtIndex(indexPath.row).objectForKey("description") as? String return cell } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { var indexPath: NSIndexPath = self.tableFeeds.indexPathForSelectedRow()! var selectedFeedURL = myFeed.objectAtIndex(indexPath.row).objectForKey("link") as String selectedFeedURL = selectedFeedURL.stringByReplacingOccurrencesOfString(" ", withString:"") selectedFeedURL = selectedFeedURL.stringByReplacingOccurrencesOfString("\n", withString:"") // feedURL = NSURL(fileURLWithPath: selectedFeedURL) //This returns with: URL + /%09%09 -- file:/// feedURL = NSURL(string: selectedFeedURL) //This returns with NIL println("Selected Feed URL: \(selectedFeedURL)") println("Feed URL: \(feedURL)") if feedURL != nil { let request : NSURLRequest = NSURLRequest(URL: feedURL!) webView.loadRequest(request) println("Feed URL: \(feedURL)") //Doesn't make it here } } } 

Any suggestions?

+5
source share
4 answers

The url url should look like this:

selectedFeedUrl = selectedFeedUrl.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)

+8
source

In iOs 9:

 myString = myString.stringByAddingPercentEncodingWithAllowedCharacters(NSCharacterSet.URLQueryAllowedCharacterSet())! 

Hope this helps

+5
source

For swift3 you can do it like this:

 let url = URL(string:url.addingPercentEncoding(withAllowedCharacters: NSCharacterSet.urlQueryAllowed)!)! 
+4
source

Thanks guys for your help. I added these two lines to my code, and now it works:

  selectedFeedURL = selectedFeedURL.stringByAddingPercentEscapesUsingEncoding(NSUTF8StringEncoding)! selectedFeedURL = selectedFeedURL.stringByReplacingOccurrencesOfString("%09%09", withString:"") 
+3
source

Source: https://habr.com/ru/post/1212552/


All Articles