2015-11-15 2 views
0

Я создал собственный класс под названием PhoneTranslator (на основе руководства Xamarin «Hello, iOS»). Это выглядит так:Пользовательский класс в Swift-преобразовании

class PhoneTranslator { 
    func ToNumber(raw:String) -> String { 
     var newNumber = raw.isEmpty ? "" : raw.uppercaseString 
     //newNumber operations... 
     return newNumber 
    } 
} 

Тогда у меня есть стандартный класс ViewController. Я хочу, чтобы это сделать:

var translatedNumber : String? 

    if let inputText = PhoneNumberTextField.text //getting text from UITextField 
    { 
     translatedNumber = PhoneTranslator.ToNumber(inputText) //error 
    } 

Затем в соответствии с методом ToNumber я получаю сообщение об ошибке Не удается преобразовать значение типа «String» к ожидаемому типу аргумента «PhoneTranslator».

Что я делаю неправильно? Кажется, что все типы ввода и вывода совпадают.

ответ

1

Изменить код

class PhoneTranslator { 
    class func ToNumber(raw:String) -> String { 
     var newNumber = raw.isEmpty ? "" : raw.uppercaseString 
     return newNumber 
    } 
} 

Ваша функция не является функцией класса. Поэтому вам нужно сначала экземпляр. Вышеуказанный код определяет функцию ToNumber как class func.

В качестве альтернативы создать экземпляр PhoneTranslator первого:

translatedNumber = PhoneTranslator().ToNumber(inputText) 

Обратите внимание на () после PhoneTranslator.

+0

Большое спасибо! –

0

В качестве альтернативы не нужно выполнять функцию класса. У вас может быть общий экземпляр, который будет одиночным объектом для всего приложения. С помощью этого единственный объект можно назвать PhoneTranslator методы

class PhoneTranslator { 

    static let sharedInstance = PhoneTranslator() 

    func ToNumber(raw:String) -> String { 
      var newNumber = raw.isEmpty ? "" : raw.uppercaseString 
      //newNumber operations... 
      return newNumber 
      } 
    } 

А вы можете назвать это так

translatedNumber = PhoneTranslator.sharedInstance.ToNumber(inputText) 
+0

хорошо, это не более дружественное к разработчикам и не более совершенное, это, вероятно, хуже во всех отношениях. Дольше писать, он вводит один синглтон (плохой), он постоянно содержит один объект типа в памяти. Зачем? – luk2302

+0

Этот подход поддерживает ленивую инициализацию, потому что Swift лениво инициализирует константы класса (и переменные) и является потокобезопасным по определению let –

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