解析 NSURL 查询属性
我有一个类似 myApp://action/1?parameter=2&secondparameter=3
的 URL
通过属性查询,我得到了我的 URL
的以下部分
parameter=2&secondparameter=3
有没有什么简单的方法将其放入 NSDictionary
或 Array
中?
非常感谢
I have a URL like myApp://action/1?parameter=2&secondparameter=3
With the property query I get following part of my URL
parameter=2&secondparameter=3
Is there any way easy to put this in a NSDictionary
or an Array
?
Thx a lot
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(17)
试试这个;)!
Try this ;)!
之前的所有帖子都没有正确进行 url 编码。我建议采用以下方法:
All previous posts do not do the url encoding properly. I would suggest the following methods:
根据已经Onato的非常干净的答案,我在Swift中编写了一个NSURL扩展,你可以在其中获取像这样的查询参数:
例如,URL 包含对 param=some_value
扩展名如下所示:
According to the already very clean answer of Onato I wrote an extension for NSURL in Swift where you can get a query param like this:
e.g. the URL contains the pair param=some_value
The extension looks like:
这是 swift 中的扩展:
Here is the extension in swift:
现在处理 URL 的首选方法是
NSURLComponents
。特别是queryItems
属性,返回参数的NSArray
。如果您想要
NSDictionary
中的参数,这里有一个方法:警告:URL 可以有重复的参数,但字典将只包含任何重复参数的最后一个值。如果不希望这样做,请直接使用
queryItems
数组。The preferred way to deal with URLs is now
NSURLComponents
. In particular thequeryItems
property which returns anNSArray
of params.If you want the params in a
NSDictionary
, here's a method:Caveat: URLs can have repeated params, but the dictionary will only contain the last value of any duplicated param. If that is undesirable, use the
queryItems
array directly.对于使用 Bolts Framework 的用户,您可以使用:
记住导入:
如果您的项目中碰巧有 Facebook SDK,那么您也有 Bolts。 Facebook 正在使用这个框架作为依赖项。
For those using Bolts Framework you can use:
Remember to import:
If you happen to have Facebook SDK in your project, you also have Bolts. Facebook is using this framework as a dependency.
Swift 2.1
Oneliner:
用作 NSURL 的扩展:
示例:
请注意,如果使用 OS X 10.10 或 iOS 8(或更高版本),最好使用
NSURLComponents
和queryItems
属性并直接从NSURLQueryItems
创建字典。这是一个基于
NSURLComponents
的NSURL
扩展解决方案:NSURL 扩展的脚注是,在 Swift 中实际上可以为属性提供与现有字符串属性相同的名称—
查询
。直到我尝试之后我才知道,但是 Swift 中的多态性让你只在返回类型上有所不同。因此,如果扩展的 NSURL 属性是public var query: [String:String]
,它就可以工作。我没有在示例中使用它,因为我发现它有点疯狂,但它确实有效......Swift 2.1
Oneliner:
Used as an extension on NSURL:
Example:
Please note, if using OS X 10.10 or iOS 8 (or later), it's probably better to use
NSURLComponents
and thequeryItems
property and create the dictionary from theNSURLQueryItems
directly.Here's a
NSURLComponents
basedNSURL
extension solution:A footnote to the NSURL extension is that it's actually possible in Swift to give the property the same name as the existing string property—
query
. I didn't know until I tried it, but the polymorphism in Swift lets you differ only on the return type. So if the extended NSURL property ispublic var query: [String:String]
it works. I didn't use this in the example as I find it a little bit crazy, but it does work ...我在麻省理工学院发布了一个简单的类来完成这项工作:
https://github.com/anegmawad/URLQueryToCocoa 您可以在查询中包含数组和对象,这些数组和对象被收集并粘合在一起
例如
将变成:
您可以将其视为
NSJSONSerializer
的 URL 查询对应项。I published a simple class doing the job under MIT:
https://github.com/anegmawad/URLQueryToCocoa
With it you can have arrays and objects in the query, which are collected and glued together
For Example
will become:
You can think of it as a URL query counterpart of
NSJSONSerializer
.您似乎正在使用它来处理来自另一个 iOS 应用程序的传入数据。如果是这样,这就是我用于相同目的的方法。
初始调用(例如在外部应用程序中):
从 NSURL 中提取 QueryString 数据并保存为 NSDictionary 的方法:
用法:
It looks that you are using it to process incoming data from another iOS application. If so, this is what I use for the same purpose.
Initial call (e.g. in external application):
Method to extract QueryString data from NSURL and save as NSDictionary:
Usage:
这个类是 url 解析的一个很好的解决方案。
.h 文件
.m 文件
This class is a nice solution for url parsing.
.h file
.m file
Hendrik 在这个问题中写了一个很好的扩展示例,但是我不得不重写它以不使用任何 Objective-c库方法。在 swift 中使用 NSArray 不是正确的方法。
这就是结果,一切都很快而且更安全。使用 Swift 1.2 的示例将减少代码行数。
用法:
或者,更详细的用法:
Hendrik wrote a nice example for extension in this question, however I had to re-write it to not use any objective-c library methods. Using
NSArray
in swift is not the correct approach.This is the result, all swift and a bit more safe. The usage example will be less lines of code with Swift 1.2.
Usage:
Or, more detailed usage:
试试这个:
try this:
相当紧凑的方法:
Fairly compact approach:
如果您使用 URL 将数据从 Web 应用程序传递到手机,并且想要传递数组、数字、字符串...,则最强大的解决方案
在 PHP 中对对象进行 JSON 编码
,并在 iOS 中对结果进行 JSON 解码
Most robust solution if you are using a URL to pass data from the web app to the phone and you want to pass arrays, numbers, strings, ...
JSON encode your object in PHP
And JSON decode the result in iOS
您可以在
URLComponents
queryItems
>。Swift
或者,您可以在 URL 上添加扩展名以使事情变得更容易。
然后您可以通过参数名称访问该参数。
You can use
queryItems
inURLComponents
.Swift
Alternatively, you can add an extension on URL to make things easier.
You can then access the parameter by its name.
我有理由为这种行为编写一些可能会派上用场的扩展。首先是标头:
这些方法扩展了 NSString、NSURL 和 NSDictionary,以允许您在查询组件字符串和包含结果的字典对象之间进行转换。
现在相关的.m代码:
I had reason to write some extensions for this behavior that might come in handy. First the header:
These methods extend NSString, NSURL, and NSDictionary, to allow you to convert to and from query components strings and dictionary objects containing the results.
Now the related .m code:
像这样的东西:
注意:这是示例代码。所有错误情况均不受管理。
Something like that:
Note : This is sample code. All error cases are not managed.