检查字符串是否与数组中的任何值匹配?

时间:2013-06-21 00:18:52

标签: iphone ios

序言:我正在处理一些我没写过的代码,而我几乎不了解iOS。

该应用有一个webview,可以处理大部分应用;内部链接在webview中加载,并且在Safari中打开了指向其他站点的链接。但是,嵌入谷歌地图也会导致safari打开。我认为,我找到了相关的控制器代码,它看起来像这样:

// a bit higher up
static NSString *const siteURL = @"http://my.example.com"


if (![request.URL.absoluteString hasPrefix:siteUrl])
{
    if ([[UIApplication sharedApplication] canOpenURL:request.URL])
    {
        [[UIApplication sharedApplication] openURL:request.URL];
    }
    return NO;
}

现在因为'maps.google.com'没有以'my.example.com'开头,所以它会用到野生动物园 - 这对我来说很有意义。但是,我尝试修改它:

static NSString *const googleMaps = @"http://maps.google.com"

if (! ([request.URL.absoluteString hasPrefix:siteUrl] || [request.URL.absoluteString hasPrefix:googleMaps]))
{
    if ([[UIApplication sharedApplication] canOpenURL:request.URL])
    {
        [[UIApplication sharedApplication] openURL:request.URL];
    }
    return NO;
}

这也有效。但我需要添加更多的URL。是我唯一选择继续添加'或'和字符串常量?或者有没有办法制作一个数组并说“如果它匹配任何这些”?对不起,如果这个问题看似简单。

在PHP中我只是做in_array('string', $array)之类的事情作为我的条件,我想我正在寻找在iOS中如何做到这一点

4 个答案:

答案 0 :(得分:2)

一种解决方案是维护一个NSSet对象,即您希望在内部webview中处理的所有字符串。

NSSet *internalURLSet = [NSSet setWithObjects:@"http://my.example.com", @"http://maps.google.com", nil];

如果您要随着时间的推移添加到集合中,请使用可变集,但是一旦您的应用启动,您可能会知道您想要在内部处理哪些URL,这不会改变。如果您在应用程序运行时添加集合,则将它们添加到可变集中,因为它们已知。

检查网址时,请使用[internalURLSet containsObject:urlToTest],它会匹配您添加到网上的任何字符串。

检查集合非常有效。将对象添加到集合中的次数较少,但是当您多次检查时,很可能只将URL添加到集合中。

(针对NSArray做indexOfObject:效率非常低......)

答案 1 :(得分:0)

您可以尝试使用谓词。这是一个示例的教程链接(较旧,但应该仍然有用):

http://arstechnica.com/apple/2009/04/cocoa-dev-the-joy-of-nspredicates-and-matching-strings/

我做了很多.NET开发,当我回到iOS时总是想念LINQ。由于你可以进行各种搜索,因此谓词可以帮助一些代码,但是很方便。

答案 2 :(得分:0)

我看到了你的问题。在IOS中,没有函数in_array('string',$ array)来检查数组中是否包含字符串。 我有一个建议:你创建一个包含所有网址的数组。并实现'for'或'while'循环以获取数组的值检查它。如果相同,则调用函数OpenUrl。

答案 3 :(得分:-1)

您可以通过创建URL的NSArray,然后使用indexOfObjectPassingTest:方法针对阵列中的每个URL测试您的URL来实现此目的。它会是这样的:

NSArray *testURLs = @[ @"http://maps.google.com", @"http://www.example.com" ];

NSString *urlString = request.URL.absoluteString;
BOOL urlMatchedTest = NO;
for ( NSString *testURL in testURLs ) {
    if [urlString hasPrefix:testURL] ) {
        urlMatchedTest = YES;
    }
}
if ( urlMatchedTest ){
    // the url contains one of the test URLS
} else {
    // it didn't match any of the test URLs
}