2017-05-13 7 views
0

Ich habe eine String-Erweiterung für die Validierung des Formulars in Swift 3 Sprache gemacht. Der Code ist unten:Verwendung von nicht aufgelösten Bezeichner bei Verwendung der Erweiterung in Swift 3

import UIKit 
extension String { 
    // Validating Email ID 
    func isValidEmail(testStr:String) -> Bool { 
     let emailRegEx = "[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{2,}" 
     let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) 
     return emailTest.evaluate(with: testStr) 
    } 
    // Validating the User name 
    func isValidUserName(testStr:String) -> Bool { 
     let RegEx = "\\A\\w{7,18}\\z" 
     let Test = NSPredicate(format:"SELF MATCHES %@", RegEx) 
     return Test.evaluate(with: testStr) 
    } 
    // Validating the phone number 
    var isPhoneNumber: Bool { 
     do { 
      let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.phoneNumber.rawValue) 
      let matches = detector.matches(in: self, options: [], range: NSMakeRange(0, self.characters.count)) 
      if let res = matches.first { 
       return res.resultType == .phoneNumber && res.range.location == 0 && res.range.length == self.characters.count 
      } else { 
       return false 
      } 
     } catch { 
      return false 
     } 
    } 
    // validating the password 
    /* 
    Use the function of Swift 3.0. 
     1. 8 characters length 
     2. alphabet 
     3. special character 
     regex Syntax Explanation : 
     (?=.[a-z]) for Character. 
     (?=.[[email protected]$#!%?&]) for special character. 
     {8,} for length which you want to prefer. 
    */ 
    func isPasswordValid(_ password : String) -> Bool{ 
     let passwordTest = NSPredicate(format: "SELF MATCHES %@", "^(?=.*[a-z])(?=.*[[email protected]$#!%*?&])[A-Za-z\\[email protected]$#!%*?&]{8,}") 
     return passwordTest.evaluate(with: password) 
    } 
    // validating the password and confirm password are same........................ 
    func isPasswordSame(password: String , confirmPassword : String) -> Bool { 
     if password == confirmPassword{ 
      return true 
     } else { 
      return false 
     } 
    } 
    // validating Blank Text........................ 
    var isBlank:Bool { 
     return self.trimmingCharacters(in: CharacterSet.whitespacesAndNewlines).isEmpty 
    } 
} 

Aber wenn ich versuche, diese Erweiterung Klasse in anderen View-Controller über den Code zu verwenden:

if isValidEmail("[email protected]"){ 
      print("Validate EmailID") 
     } 
     else{ 
      print("invalide EmailID") 
     } 

ich die Störung erhalte: Error Shown

+3

denken ist, dass Sie Klasse func Methode wollen, rufen 'String.isValidEmail ("myString") ', oder besser noch Instanzen," myString ".isValidEmail()', aber in beiden Fällen möchten Sie vielleicht die Deklaration der Methoden überarbeiten. Wenn Sie "self" nicht in einer Instanzmethode oder einer seiner Eigenschaften verwenden, haben Sie möglicherweise etwas falsches (etwas vergessen, falsches Design usw.). – Larme

+1

Sie müssen Ihre Erweiterung reparieren, weil Sie sie nicht benötigen um Parameter bei der Erweiterung Ihres Typs zu übergeben. –

+0

überprüfen Sie diese http://stackoverflow.com/questions/31954416/regex-for-alphanumeric-without-special-characters-swift-ios/31954533#31954533 es könnte Ihnen helfen zu verstehen, –

Antwort

3

isValidEmail ist keine lockere Funktion. Sie haben es als Instanz Funktion auf String definiert. Sie müssten sagen:

"someString".isValidEmail(testStr:"someOtherString") 

Das macht keinen Sinn, aber das ist, wie Sie es konfiguriert haben. Wenn Sie es so schreiben, wird Ihr Code kompilieren (obwohl es sehr dummer Code sein wird).

+0

, wie es meine Erweiterung zu beheben? –

+0

@JessicaRoot. Sie müssen den Unterschied zwischen Instanz und Klasse und verwandten Themen, Instanzmethoden und Klassenmethoden, verstehen. Es ist ein Basic Oriented Object Programming Thema. Daran sollte SO hier zu fragen sein. Sobald Sie dies getan haben, wenden Sie es in Swift an. – Larme

+0

Ich hätte es als 'func isValidEmail() -> Bool' definiert, mit' self', wo Sie 'testStr' verwenden. – matt

0

einfach Ihre Definition zu so etwas wie

extension String { 
// Validating Email ID 
func isValidEmail() -> Bool { 
    self.validate... 
} 

ändern und es dann in Ihrem Code verwenden als

@someString".isValidEmail() 
Verwandte Themen