NSNotFound for Swift

时间:2015-09-22 01:30:42

标签: ios swift xcode7

我在Antony找到了此解决方案来验证网址。

// https://github.com/jashkenas/backbone/blob/master/backbone.js#L782

// Define the Collection's inheritable methods.
_.extend(Collection.prototype, Events, {

  // The default model for a collection is just a **Backbone.Model**.
  // This should be overridden in most cases.
  model: Model,

我想尝试一下,但我正在快速编码。 这是我到目前为止所做的。

- (BOOL)isValidURL {
    NSUInteger length = [self length];
    // Empty strings should return NO
    if (length > 0) {
       NSError *error = nil;
       NSDataDetector *dataDetector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:&error];
       if (dataDetector && !error) {
          NSRange range = NSMakeRange(0, length);
          NSRange notFoundRange = (NSRange){NSNotFound, 0};
          NSRange linkRange = [dataDetector rangeOfFirstMatchInString:self options:0 range:range];
          if (!NSEqualRanges(notFoundRange, linkRange) && NSEqualRanges(range, linkRange)) {
             return YES;
          }
       }
       else {
          NSLog(@"Could not create link data detector: %@ %@", [error localizedDescription], [error userInfo]);
       }
    }
    return NO;
}

绊脚石是NSNotFound。据我所知,这是swift可选项的用途。如何格式化该行?

2 个答案:

答案 0 :(得分:4)

它只是C语言结构的aggregate initialization语法。您可以使用NSRange初始化程序:

let notFoundRange = NSRange(location: NSNotFound, length: 0)

或者,或许更简单:

if linkRange.location != NSNotFound { ...

答案 1 :(得分:1)

对于那些你感兴趣的人来说,使用jtbandes的答案在swift中工作的功能相同。我已经尝试过一堆网址了。似乎工作得很好..

extension String{
    func isValidURL() -> Bool{
        let length:Int = self.characters.count
        var err:NSError?
        var dataDetector:NSDataDetector? = NSDataDetector()
        do{
            dataDetector = try NSDataDetector(types: NSTextCheckingType.Link.rawValue)
        }catch{
            err = error as NSError
        }
        if dataDetector != nil{
            let range = NSMakeRange(0, length)
            let notFoundRange = NSRange(location: NSNotFound, length: 0)
            let linkRange = dataDetector?.rangeOfFirstMatchInString(self, options: NSMatchingOptions.init(rawValue: 0), range: range)
            if !NSEqualRanges(notFoundRange, linkRange!) && NSEqualRanges(range, linkRange!){
                return true
            }
        }else{
            print("Could not create link data detector: \(err?.localizedDescription): \(err?.userInfo)")
        }

        return false
    }
}