पार्स NSURL क्वेरी प्रॉपर्टी


82

मेरे पास एक URL है myApp://action/1?parameter=2&secondparameter=3

संपत्ति के प्रश्न के साथ मुझे अपने हिस्से का पालन करना है URL

parameter=2&secondparameter=3

वहाँ एक NSDictionaryया एक में यह आसान करने के लिए कोई रास्ता नहीं है Array?

बहुत बहुत धन्यवाद

जवाबों:


54

ऐसा कुछ:

NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
for (NSString *param in [url componentsSeparatedByString:@"&"]) {
  NSArray *elts = [param componentsSeparatedByString:@"="];
  if([elts count] < 2) continue;
  [params setObject:[elts lastObject] forKey:[elts firstObject]];
}

नोट : यह नमूना कोड है। सभी त्रुटि मामलों का प्रबंधन नहीं किया जाता है।


2
यह कोड एक विकृत क्वेरी के मामले में क्रैश हो जाएगा। नीचे सुरक्षित समाधान देखें।
BadPirate

2
ठीक है, आप सिर्फ सरणी आकार पर एक चेक जोड़ सकते हैं! यह कोड केवल एक शुरुआत थी (हमेशा की तरह SO पर)। यदि आप सभी URL का अनुपालन करना चाहते हैं, तो आपके पास भागने के तार, टुकड़े (अंत में # भाग) का इलाज करने के लिए और अधिक कार्य हैं, ...
Benît

आप के लिए एक संपादन में रखो। जवाब के साथ मुद्दे पर आपका ध्यान लाने के लिए केवल वोट दिया। एक बार एडिट के माध्यम से जाने के बाद मैं इसे वापस ला पाऊंगा।
बैडपिरेट

1
यह कोड बिना किसी विशेष वर्ण के सबसे सरल केस मानों को छोड़कर सही करने के करीब नहीं है।
निक स्नाइडर

आपको इसके बजाय अंतिम और पहली वस्तु का उपयोग करना चाहिए: [params setObject:[elts lastObject] forKey:[elts firstObject]];इसकी अधिक सुरक्षित
Laszlo

147

आप उपयोग कर सकते हैं queryItemsमें URLComponents

जब आप इस गुण का मान प्राप्त करते हैं, तो NSURLCompords वर्ग क्वेरी स्ट्रिंग को पार्स करता है और NSURLQueryItem ऑब्जेक्ट की एक सरणी देता है, जिनमें से प्रत्येक एक एकल कुंजी-मूल्य जोड़ी का प्रतिनिधित्व करता है, जिस क्रम में वे मूल क्वेरी स्ट्रिंग में दिखाई देते हैं।

तीव्र

let url = "http://example.com?param1=value1&param2=param2"
let queryItems = URLComponents(string: url)?.queryItems
let param1 = queryItems?.filter({$0.name == "param1"}).first
print(param1?.value)

वैकल्पिक रूप से, आप चीजों को आसान बनाने के लिए URL पर एक्सटेंशन जोड़ सकते हैं।

extension URL {
    var queryParameters: QueryParameters { return QueryParameters(url: self) }
}

class QueryParameters {
    let queryItems: [URLQueryItem]
    init(url: URL?) {
        queryItems = URLComponents(string: url?.absoluteString ?? "")?.queryItems ?? []
        print(queryItems)
    }
    subscript(name: String) -> String? {
        return queryItems.first(where: { $0.name == name })?.value
    }
}

आप इसके नाम से पैरामीटर तक पहुँच सकते हैं।

let url = "http://example.com?param1=value1&param2=param2"
print(url.queryParameters["param1"])

11
iOS7 के बाद से क्वेरी। iOS8 के बाद से क्वेरी।
ओनाटो

इस उत्तर के लिए धन्यवाद। इसके अतिरिक्त, मुझे NSURLCompords के बारे में अधिक जानने के लिए निम्नलिखित लेख बहुत उपयोगी लगा: nshipster.com/nsurl
xaphod

बहुत बढ़िया जवाब। धन्यवाद!
dpigera

यदि URL में # वर्ण है, तो अजीब बात है, NSURLCompords काम नहीं करता है। http://example.com/abc#abc?param1=value1&param2=param2 क्वेरी की तरह यह शून्य होगा
पेड्रो

ऐसा इसलिए है क्योंकि टुकड़ा (#abc) अंत में है।
Onato

55

मेरे पास इस व्यवहार के लिए कुछ एक्सटेंशन लिखने का कारण था जो काम में आ सकता है। पहला शीर्षक:

#import <Foundation/Foundation.h>

@interface NSString (XQueryComponents)
- (NSString *)stringByDecodingURLFormat;
- (NSString *)stringByEncodingURLFormat;
- (NSMutableDictionary *)dictionaryFromQueryComponents;
@end

@interface NSURL (XQueryComponents)
- (NSMutableDictionary *)queryComponents;
@end

@interface NSDictionary (XQueryComponents)
- (NSString *)stringFromQueryComponents;
@end

इन विधियों में NSString, NSURL, और NS Shadow का विस्तार है, जिससे आप क्वेरी कंपोनेंट स्ट्रिंग्स और डिक्शनरी ऑब्जेक्ट से कन्वर्ट कर सकते हैं।

अब संबंधित .m कोड:

#import "XQueryComponents.h"

@implementation NSString (XQueryComponents)
- (NSString *)stringByDecodingURLFormat
{
    NSString *result = [self stringByReplacingOccurrencesOfString:@"+" withString:@" "];
    result = [result stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return result;
}

- (NSString *)stringByEncodingURLFormat
{
    NSString *result = [self stringByReplacingOccurrencesOfString:@" " withString:@"+"];
    result = [result stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    return result;
}

- (NSMutableDictionary *)dictionaryFromQueryComponents
{
    NSMutableDictionary *queryComponents = [NSMutableDictionary dictionary];
    for(NSString *keyValuePairString in [self componentsSeparatedByString:@"&"])
    {
        NSArray *keyValuePairArray = [keyValuePairString componentsSeparatedByString:@"="];
        if ([keyValuePairArray count] < 2) continue; // Verify that there is at least one key, and at least one value.  Ignore extra = signs
        NSString *key = [[keyValuePairArray objectAtIndex:0] stringByDecodingURLFormat];
        NSString *value = [[keyValuePairArray objectAtIndex:1] stringByDecodingURLFormat];
        NSMutableArray *results = [queryComponents objectForKey:key]; // URL spec says that multiple values are allowed per key
        if(!results) // First object
        {
            results = [NSMutableArray arrayWithCapacity:1];
            [queryComponents setObject:results forKey:key];
        }
        [results addObject:value];
    }
    return queryComponents;
}
@end

@implementation NSURL (XQueryComponents)
- (NSMutableDictionary *)queryComponents
{
    return [[self query] dictionaryFromQueryComponents];
}
@end

@implementation NSDictionary (XQueryComponents)
- (NSString *)stringFromQueryComponents
{
    NSString *result = nil;
    for(__strong NSString *key in [self allKeys])
    {
        key = [key stringByEncodingURLFormat];
        NSArray *allValues = [self objectForKey:key];
        if([allValues isKindOfClass:[NSArray class]])
            for(__strong NSString *value in allValues)
            {
                value = [[value description] stringByEncodingURLFormat];
                if(!result)
                    result = [NSString stringWithFormat:@"%@=%@",key,value];
                else 
                    result = [result stringByAppendingFormat:@"&%@=%@",key,value];
            }
        else {
            NSString *value = [[allValues description] stringByEncodingURLFormat];
            if(!result)
                result = [NSString stringWithFormat:@"%@=%@",key,value];
            else 
                result = [result stringByAppendingFormat:@"&%@=%@",key,value];
        }
    }
    return result;
}
@end

दो समस्याएं: 1) आपको URL को डिक्शनरी में सहेजने से पहले कुंजी और मान दोनों को डीकोड करना होगा और 2) URL के नियमों के अनुसार, आपको एक ही कुंजी को कई बार निर्दिष्ट करने की अनुमति है। IOW, यह एक मान के लिए एक महत्वपूर्ण मैप किया जाना चाहिए, एक मूल्य पर नहीं।
डेव डोंगलॉन्ग

ठीक है, आप सिर्फ सरणी आकार पर एक चेक जोड़ सकते हैं (क्या यह मेरे जवाब पर डाउन वोट की आवश्यकता है?)। यह कोड केवल एक शुरुआत थी (हमेशा की तरह SO पर)। यदि आप सभी URL का अनुपालन करना चाहते हैं, तो आपके पास भागने के तार, टुकड़े (अंत में # भाग) का इलाज करने के लिए और अधिक काम हैं, ...
Benît

दवे - अच्छे अंक। मेरी जरूरतों के लिए आवश्यक नहीं था, लेकिन जब से मैं एक उत्तर देने की कोशिश कर रहा हूं जो इस सामान्य समस्या पर जाने वाले सभी के लिए काम करेगा, जिसमें मैंने उल्लिखित कार्यक्षमता शामिल की है ... बेनोइट - बस अपने जवाब के साथ मुद्दे पर आपका ध्यान आकर्षित कर रहा हूं, मैंने एक संपादन प्रस्तुत किया। संभवत: अन्यथा अच्छे उत्तरों में मामूली मुद्दों पर ध्यान देने के लिए नीचे उपयोग करने का सबसे अच्छा तरीका नहीं है, मैं भविष्य में ऐसा करने से बचना
चाहूंगा

StringByDecodingURLFormat में 'परिणाम' का प्रकार NSString * होना चाहिए।
थॉमस डब्ल्यूडब्ल्यू

बस एक और मुद्दा देखा। कुंजी और मूल्य मिश्रित हो रहे हैं, कुंजी ऑब्जेक्ट होना चाहिए: Indexex: 0 और मान objectAtIndex: 1।
थॉमसडब्ल्यू

13

इसे इस्तेमाल करे ;)!

NSString *query = @"parameter=2&secondparameter=3"; // replace this with [url query];
NSArray *components = [query componentsSeparatedByString:@"&"];
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init];
for (NSString *component in components) {
    NSArray *subcomponents = [component componentsSeparatedByString:@"="];
    [parameters setObject:[[subcomponents objectAtIndex:1] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]
                   forKey:[[subcomponents objectAtIndex:0] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
}

1
यह भी ध्यान दें - BadPirate द्वारा नोट किए गए क्रैश मुद्दे से परे - (1) कि शब्दकोश कुंजी / मान उलट हैं; (2) कुंजी / मान अभी भी एन्कोड किए गए हैं ताकि आप स्ट्रिंग करना चाहते हैंबेडकोडिंग्यूरलफॉर्मैट
dpjanes

यह करने का वास्तव में अच्छा तरीका है
Burf2000

9

पिछले सभी पोस्ट url एन्कोडिंग को ठीक से नहीं करते हैं। मैं निम्नलिखित विधियों का सुझाव दूंगा:

+(NSString*)concatenateQuery:(NSDictionary*)parameters {
    if([parameters count]==0) return nil;
    NSMutableString* query = [NSMutableString string];
    for(NSString* parameter in [parameters allKeys])
        [query appendFormat:@"&%@=%@",[parameter stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet],[[parameters objectForKey:parameter] stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]];
    return [[query substringFromIndex:1] copy];
}
+(NSDictionary*)splitQuery:(NSString*)query {
    if([query length]==0) return nil;
    NSMutableDictionary* parameters = [NSMutableDictionary dictionary];
    for(NSString* parameter in [query componentsSeparatedByString:@"&"]) {
        NSRange range = [parameter rangeOfString:@"="];
        if(range.location!=NSNotFound)
            [parameters setObject:[[parameter substringFromIndex:range.location+range.length] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding] forKey:[[parameter substringToIndex:range.location] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
        else [parameters setObject:[[NSString alloc] init] forKey:[parameter stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    }
    return [parameters copy];
}

if(!query||[query length] == 0)बेमानी है। आप सुरक्षित if([query length] == 0)रूप से इस बात की जाँच कर सकते हैं कि query == nil, 0यदि आप उस पर कॉल करने का प्रयास करते हैं तो यह मान लौटा देगा ।
JRG- डेवलपर

यह objectForKey का उपयोग नहीं किया जाना चाहिए और नहीं valueforkey?
एसएफ

अच्छा कोड है। मैं उपयोग करने का सुझाव NSUTF8StringEncodingमें splitQueryसभी वर्णसेट समर्थन करने के लिए :) इसके अलावा, [string stringByAddingPercentEncodingWithAllowedCharacters:NSCharacterSet.URLQueryAllowedCharacterSet]के लिए एन्कोडिंग के एक नए तरीका है concatenateQuery
विलियम डेनिस

मुझे लगता है कि एक अपरिवर्तनीय उदाहरण को वापस करने के लिए यह अच्छा अभ्यास है, इसलिए शायद आपको [पैरामीटर कॉपी] वापस करने के लिए अंतिम पंक्ति को बदलना चाहिए;
ग्लेन होव्स

धन्यवाद। मैंने आपकी टिप्पणियों के अनुसार कोड को अनुकूलित किया है!
क्रिस्टियन क्रालिजिक

7

यहाँ तेजी में विस्तार है:

extension NSURL{
        func queryParams() -> [String:AnyObject] {
            var info : [String:AnyObject] = [String:AnyObject]()
            if let queryString = self.query{
                for parameter in queryString.componentsSeparatedByString("&"){
                    let parts = parameter.componentsSeparatedByString("=")
                    if parts.count > 1{
                        let key = (parts[0] as String).stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
                        let value = (parts[1] as String).stringByReplacingPercentEscapesUsingEncoding(NSUTF8StringEncoding)
                        if key != nil && value != nil{
                            info[key!] = value
                        }
                    }
                }
            }
            return info
        }
    }

7

ओनाटो के पहले से ही बहुत साफ जवाब के अनुसार मैंने स्विफ्ट में NSURL के लिए एक एक्सटेंशन लिखा है, जहां आप एक प्रश्न पूछ सकते हैं:

उदाहरण के लिए URL में जोड़ी param = some_value है

let queryItem = url.queryItemForKey("param")
let value = queryItem.value // would get String "someValue"

विस्तार जैसा दिखता है:

extension NSURL {

  var allQueryItems: [NSURLQueryItem] {
      get {
          let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false)!
          let allQueryItems = components.queryItems!
          return allQueryItems as [NSURLQueryItem]
      }
  }

  func queryItemForKey(key: String) -> NSURLQueryItem? {

      let predicate = NSPredicate(format: "name=%@", key)!
      return (allQueryItems as NSArray).filteredArrayUsingPredicate(predicate).first as? NSURLQueryItem

  }
}

यह सबसे अच्छा जवाब है! उन्होंने एपीआई दस्तावेजों की जांच क्यों नहीं की?
जामिन जांग

5

बोल्ट फ्रेमवर्क का उपयोग करने वालों के लिए आप उपयोग कर सकते हैं:

NSDictionary *parameters = [BFURL URLWithURL:yourURL].inputQueryParameters;

आयात करना याद रखें:

#import <Bolts/BFURL.h>

अगर आपके प्रोजेक्ट में फेसबुक एसडीके है, तो आपके पास बोल्ट भी हैं । फेसबुक इस ढांचे का उपयोग निर्भरता के रूप में कर रहा है।


स्विफ्ट इन बोल्ट्स:BFURL(url: url)?.inputQueryParameters?["myKey"] as? String
JAL

4

URL से निपटने का पसंदीदा तरीका अब है NSURLComponents। विशेष रूप से queryItemsसंपत्ति जो वापस आती हैNSArray परिमों की है।

यदि आप एक में params चाहते हैं NSDictionary, यहाँ एक विधि है:

+(NSDictionary<NSString *, NSString *>*)queryParamsFromURL:(NSURL*)url
{
    NSURLComponents* urlComponents = [NSURLComponents componentsWithURL:url resolvingAgainstBaseURL:NO];

    NSMutableDictionary<NSString *, NSString *>* queryParams = [NSMutableDictionary<NSString *, NSString *> new];
    for (NSURLQueryItem* queryItem in [urlComponents queryItems])
    {
        if (queryItem.value == nil)
        {
            continue;
        }
        [queryParams setObject:queryItem.value forKey:queryItem.name];
    }
    return queryParams;
}

कैविएट: URL में बार-बार पैरामेट्स हो सकते हैं, लेकिन डिक्शनरी में केवल किसी डुप्लिकेट किए गए परम का अंतिम मूल्य होगा। यदि यह अवांछनीय है, तो queryItemsसीधे ऐरे का उपयोग करें ।


3

स्विफ्ट 2.1

एक लाइन:

"p1=v1&p2=v2".componentsSeparatedByString("&").map {
    $0.componentsSeparatedByString("=") 
}.reduce([:]) {
    (var dict: [String:String], p) in
    dict[p[0]] = p[1]
    return dict
}

// ["p1": "v1", "p2": "v2"]

NSURL पर विस्तार के रूप में प्रयुक्त:

extension NSURL {

    /**
     * URL query string as dictionary. Empty dictionary if query string is nil.
     */
    public var queryValues : [String:String] {
        get {
            if let q = self.query {
                return q.componentsSeparatedByString("&").map {
                    $0.componentsSeparatedByString("=") 
                }.reduce([:]) {
                    (var dict: [String:String], p) in
                    dict[p[0]] = p[1]
                    return dict
                }
            } else {
                return [:]
            }
        }
    }

}

उदाहरण:

let url = NSURL(string: "http://example.com?p1=v1&p2=v2")!
let queryDict = url.queryValues

// ["p1": "v1", "p2": "v2"]

कृपया ध्यान दें, यदि OS X 10.10 या iOS 8 (या बाद में) का उपयोग किया जाता है, तो संभवतः इसका उपयोग करना बेहतर है NSURLComponentsऔर queryItemsसंपत्ति और NSURLQueryItemsसीधे से शब्दकोश बनाएं ।

यहाँ एक NSURLComponentsआधारित NSURLविस्तार समाधान है:

extension NSURL {

    /// URL query string as a dictionary. Empty dictionary if query string is nil.
    public var queryValues : [String:String] {
        get {
            guard let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false) else {
                return [:]
            }

            guard let queryItems = components.queryItems else {
                return [:]
            }

            var result:[String:String] = [:]
            for q in queryItems {
                result[q.name] = q.value
            }
            return result
        }
    }

}

NSURL एक्सटेंशन के लिए एक फुटनोट यह है कि यह वास्तव में स्विफ्ट में मौजूदा स्ट्रिंग संपत्ति के समान नाम देने के लिए संभव है- query। मुझे तब तक नहीं पता था जब तक मैंने इसकी कोशिश नहीं की थी, लेकिन स्विफ्ट में बहुरूपता आपको केवल रिटर्न प्रकार पर भिन्न होता है। तो अगर विस्तारित NSURL संपत्ति public var query: [String:String]यह काम करता है। मैंने इसे उदाहरण में इस्तेमाल नहीं किया क्योंकि मुझे यह थोड़ा पागल लगता है, लेकिन यह काम करता है ...


2

मैंने MIT के तहत नौकरी करने वाला एक साधारण वर्ग प्रकाशित किया:

https://github.com/anegmawad/URLQueryToCocoa

इसके साथ आप क्वेरी में सरणियाँ और ऑब्जेक्ट हो सकते हैं, जिन्हें एकत्र किया जाता है और एक साथ चिपका दिया जाता है

उदाहरण के लिए

users[0][firstName]=Amin&users[0][lastName]=Negm&name=Devs&users[1][lastName]=Kienle&users[1][firstName]=Christian

हो जाएगा:

@{
   name : @"Devs",
   users :
   @[
      @{
         firstName = @"Amin",
         lastName = @"Negm"
      },
      @{
         firstName = @"Christian",
         lastName = @"Kienle"
      }
   ]
 }

आप इसे एक URL क्वेरी प्रतिपक्ष के रूप में सोच सकते हैं NSJSONSerializer


उत्कृष्ट कार्य। यह केवल सही उत्तर लगता है (जो कि सरणी और तानाशाही मूल्यों को ध्यान में रखता है)।
एंटोन ट्रोपास्को

2

ऐसा लगता है कि आप इसका उपयोग किसी अन्य iOS एप्लिकेशन से आने वाले डेटा को संसाधित करने के लिए कर रहे हैं। यदि हां, तो यही मैं उसी उद्देश्य के लिए उपयोग करता हूं।

प्रारंभिक कॉल (उदाहरण के लिए बाहरी एप्लिकेशन):

UIApplication *application = [UIApplication sharedApplication];
NSURL *url = [NSURL URLWithString:@"myApp://action/1?parameter=2&secondparameter=3"];
if ([application canOpenURL:url]) {
    [application openURL:url];
    NSLog(@"myApp is installed");
} else {
    NSLog(@"myApp is not installed");
}

NSURL से QueryString डेटा निकालने और NS सहारे के रूप में सहेजने की विधि:

-(NSDictionary *) getNSDictionaryFromQueryString:(NSURL *)url {
   NSMutableDictionary *result = [[NSMutableDictionary alloc] init];
   NSRange needle = [url.absoluteString rangeOfString:@"?" options:NSCaseInsensitiveSearch];
   NSString *data = nil;

   if(needle.location != NSNotFound) {
       NSUInteger start = needle.location + 1;
       NSUInteger end = [url.absoluteString length] - start;
       data = [url.absoluteString substringWithRange:NSMakeRange(start, end)];
   }

   for (NSString *param in [data componentsSeparatedByString:@"&"]) {
       NSArray *keyvalue = [param componentsSeparatedByString:@"="];
       if([keyvalue count] == 2){
           [result setObject:[keyvalue objectAtIndex:1] forKey:[keyvalue objectAtIndex:0]];
       }
   }

  return result;
}

उपयोग:

NSDictionary *result = [self getNSDictionaryFromQueryString:url];

0

यह वर्ग url पार्सिंग के लिए एक अच्छा समाधान है।

.h फाइल

@interface URLParser : NSObject {
    NSArray *variables;
}

@property (nonatomic, retain) NSArray *variables;

- (id)initWithURLString:(NSString *)url;
- (NSString *)valueForVariable:(NSString *)varName;

@end

.m फ़ाइल

#import "URLParser.h"

@implementation URLParser
@synthesize variables;

- (id) initWithURLString:(NSString *)url{
    self = [super init];
    if (self != nil) {
        NSString *string = url;
        NSScanner *scanner = [NSScanner scannerWithString:string];
        [scanner setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"&?"]];
        NSString *tempString;
        NSMutableArray *vars = [NSMutableArray new];
        [scanner scanUpToString:@"?" intoString:nil];       //ignore the beginning of the string and skip to the vars
        while ([scanner scanUpToString:@"&" intoString:&tempString]) {
            [vars addObject:[tempString copy]];
        }
        self.variables = vars;
    }
    return self;
}

- (NSString *)valueForVariable:(NSString *)varName {
    for (NSString *var in self.variables) {
        if ([var length] > [varName length]+1 && [[var substringWithRange:NSMakeRange(0, [varName length]+1)] isEqualToString:[varName stringByAppendingString:@"="]]) {
            NSString *varValue = [var substringFromIndex:[varName length]+1];
            return varValue;
        }
    }
    return nil;
}

@end

0

हेंड्रिक ने इस प्रश्न में विस्तार के लिए एक अच्छा उदाहरण लिखा है, हालांकि मुझे इसे किसी भी उद्देश्य-सी पुस्तकालय विधियों का उपयोग नहीं करने के लिए फिर से लिखना पड़ा। NSArrayस्विफ्ट में इस्तेमाल करना सही तरीका नहीं है।

यह परिणाम है, सभी स्विफ्ट और थोड़ा अधिक सुरक्षित है। उपयोग उदाहरण स्विफ्ट 1.2 के साथ कोड की कम लाइनें होगी।

public extension NSURL {
    /*
    Set an array with all the query items
    */
    var allQueryItems: [NSURLQueryItem] {
        get {
            let components = NSURLComponents(URL: self, resolvingAgainstBaseURL: false)!
            if let allQueryItems = components.queryItems {
                return allQueryItems as [NSURLQueryItem]
            } else {
                return []
            }
        }
    }

    /**
    Get a query item form the URL query

    :param: key The parameter to fetch from the URL query

    :returns: `NSURLQueryItem` the query item
    */
    public func queryItemForKey(key: String) -> NSURLQueryItem? {
        let filteredArray = filter(allQueryItems) { $0.name == key }

        if filteredArray.count > 0 {
            return filteredArray.first
        } else {
            return nil
        }
    }
}

उपयोग:

let queryItem = url.queryItemForKey("myItem")

या, अधिक विस्तृत उपयोग:

if let url = NSURL(string: "http://www.domain.com/?myItem=something") {
    if let queryItem = url.queryItemForKey("myItem") {
        if let value = queryItem.value {
            println("The value of 'myItem' is: \(value)")
        }
    }
}

0

इसे इस्तेमाल करे:

-(NSDictionary *)getUrlParameters:(NSString *)url{
    NSArray *justParamsArr = [url componentsSeparatedByString:@"?"];
    url = [justParamsArr lastObject];
    NSMutableDictionary *params = [[NSMutableDictionary alloc] init];
    for (NSString *param in [url componentsSeparatedByString:@"&"]) {
        NSArray *elts = [param componentsSeparatedByString:@"="];
        if([elts count] < 2) continue;
        [params setObject:[elts lastObject] forKey:[elts firstObject]];
    }
    return params;
}

0

काफी कॉम्पैक्ट दृष्टिकोण:

    func stringParamsToDict(query: String) -> [String: String] {
        let params = query.components(separatedBy: "&").map {
            $0.components(separatedBy: "=")
        }.reduce(into: [String: String]()) { dict, pair in
            if pair.count == 2 {
                dict[pair[0]] = pair[1]
            }
        }
        return params
    }

-5

सबसे मजबूत समाधान यदि आप वेब ऐप से फोन पर डेटा पास करने के लिए URL का उपयोग कर रहे हैं और आप सरणियाँ, संख्याएँ, स्ट्रिंग्स, पास करना चाहते हैं ...

JSON आपकी ऑब्जेक्ट को PHP में एनकोड करता है

header("Location: myAppAction://".urlencode(json_encode($YOUROBJECT)));

और JSON ने iOS में परिणाम को डिकोड किया

NSData *data = [[[request URL] host] dataUsingEncoding:NSUTF8StringEncoding];
NSDictionary *packed = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];

1
एक भयानक विचार है। एक URL की लंबाई सीमा होती है जिसे आसानी से पार किया जा सकता है यदि आप JSON को इसके लिए अनुक्रमित कर रहे हैं।
माइकल बाल्ड्री

इसके लगभग 2000 अक्षर
माइकल बाल्ड्री
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.