2015-04-28 2 views
4

Я пытаюсь преобразовать этот рабочий объектный код C для Swift (which is based on this Apple Documentation)NSDataDetector не найти номер телефона тип результата

-(BOOL)validatePhone:(NSString*)phone { 
    NSError *error = NULL; 
    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber 
                   error:&error]; 

    NSArray *matches = [detector matchesInString:phone 
             options:0 
              range:NSMakeRange(0, [phone length])]; 

    for (NSTextCheckingResult *match in matches) { 
     if ([match resultType] == NSTextCheckingTypePhoneNumber) { 
      NSString *phoneNumber = [match phoneNumber]; 
      self.inputPhoneNumber.text = phoneNumber; 
      return TRUE; 
     } 
    } 
    NSLog(@"Phone Number Not Found"); 
    return FALSE; 
} 

Вот мой Swift преобразования:

func validatePhone(phone: NSString) -> Bool { 
    var error: NSError? 
    let detector = NSDataDetector(types: NSTextCheckingType.PhoneNumber.rawValue, error: &error) 

    var matches: NSArray = [detector!.matchesInString(phone as String, options: nil, range: NSMakeRange(0, phone.length))] 

    var match:NSTextCheckingResult 

    for match in matches{ 
     if match.resultType == NSTextCheckingType.PhoneNumber{ 
      inputPhoneNumber.text = match.phoneNumber 
      return true 
     } 
    } 

    NSLog("Phone Number Not Found") 

    return false 
} 

matches массив правильно соответствует введенному номеру телефона и правильно отображает тип, как показано здесь:

enter image description here

Но мое if заявление при проверке тип результата всегда возвращает ложь

if match.resultType == NSTextCheckingType.PhoneNumber 

Входные испытания в 555-555-5555 или 5558881234

Итак, как я должен правильно проверить на NSTextCheckingType ?

ответ

2

Попробуйте это:

var text = "555-555-5555" 

let types: NSTextCheckingType = .PhoneNumber 
var error : NSError? 

let detector = NSDataDetector(types: types.rawValue, error: &error) 
var matches = detector!.matchesInString(text, options: nil, range: NSMakeRange(0, count(text))) 

for match in matches { 
    println(match.phoneNumber!) 
} 

В приведенном выше коде, вам не нужно, чтобы проверить resultType, потому что он только входит в цикл, если сопоставить номер телефона.

Но в противном случае, если вы хотите, чтобы соответствовать более одного типа, как в следующем примере:

var text = "http://www.example.com" 

let types: NSTextCheckingType = .PhoneNumber | .Link 
var error : NSError? 

let detector = NSDataDetector(types: types.rawValue, error: &error) 
var matches = detector!.matchesInString(text, options: nil, range: NSMakeRange(0, count(text))) 

Вы можете использовать следующий код, чтобы проверить соответствие один или другой:

for match in matches { 
    if let phone = match.phoneNumber! { 
     println(phone) 
    } 

    if let url = match.URL! { 
     println(url) 
    } 
} 

Надеюсь, это поможет вам.

+0

Благодарим за включение нескольких типов, так как это мне также понадобится позже. Ваш код помог мне найти проблему. Все, что мне нужно было сделать, это удалить [] из совпадений, и это сработало. Но мне также нравится, как вы разделили типы, чтобы сделать их более читаемыми. –

Смежные вопросы