2015-03-12 1 views
5

У меня есть:Swift, переменная с таким же, как имя метода

var formVC:UIViewController! 

Я также пытаюсь иметь функцию с именем:

func formVC()->UIViewController{....} 

Я знаю, в ObjC он работал, но я Я не вижу способа сделать это в Свифте. Есть ли способ сделать это, или я не понимаю очевидных архитектурных/концептуальных изменений в Swift?

Заранее спасибо.

ответ

5

Это была плохая идея в ObjC, и это незаконно в Swift. Рассмотрим некоторые из этих случаев:

class X { 
    var value : Int = 0 
    func value() -> Int { return 1 } 
} 
let x = X() 

Что такое x.value в этом случае? Это Int или это () -> Int? Разумно и полезно относиться к методам классов, как к закрытию.

Что делать, если мы еще сложнее, и сделать это:

class X { 
    let value:() -> Int = { 2 } 
    func value() -> Int { return 1 } 
} 
let x = X() 
let v = x.value() // ???? 

Должен ли Swift использовать свойство value, а затем вызвать его? Или он должен вызвать метод value()? Закрытия полностью законны как свойства.

Такое же ограничение фактически есть в ObjC. Вы не могли бы создать синтезированное свойство, которое противоречило бы методу (если бы у них были разные типы, если они имели одинаковое время, ObjC молчал бы синтезировать аксессор). Вы думаете о свойствах Swift, похожих на эквиваленты Obars, но это неправильно. Свойства Swift эквивалентны свойствам объекта ObjC (т. Е. Методам доступа к ivars). У вас нет доступа к базовым иварам в Swift.

2

В Swift вы не можете назвать переменную и функцию одной и той же, если параметры не переданы. Хотя мы называем их по-разному (foo для переменной и foo() для функции), мы получим недопустимое исправление foo. Компилятор обрабатывает переменную, как будто у нее нет параметров, подобных функции. Однако, используя параметры, вы можете назвать функцию и переменную одной и той же, хотя я бы посоветовал вам этого не делать. В этом случае вы должны попытаться назвать переменную и функцию тем, что описывает, что они представляют и/или что они делают, чтобы сделать ваш код более читаемым другими. Я бы предложил называть переменную что-то вроде formViewController, а функция что-то вроде createFormViewController.

var foo = 0 

func foo() {} // Error: Invalid redeclaration of foo 

func foo(string: String) {} // No error 

и если вы только с помощью функции для установки переменной, используйте вычислен свойства вместо:

lazy var formViewController: UIViewController! { 
    return UIViewController() 
} 
+1

Вы должны избегать имя 'getFormViewController'. Ведущий «get» по-прежнему нарушает KVC, а Swift все еще подчиняется KVC. Но вы правы, что вам следует использовать лучшее имя для метода. –

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