2016-05-10 7 views
2

Я сделал вызов команды Treehouse, и у меня была проблема, которую я хотел спросить. В основном я создал func внутри enum, который принимает конкретный случай перечисления и инициализирует данный объект. Он сказал мне создать его внутри перечисления, но, к сожалению, когда я это делаю, я наткнулся на некоторые ошибки. Я смог закончить вызов, сделав это за пределами перечисления, но я не думаю, что это именно то, что я должен был делать.Проблема с типами в swift?

В любом случае, проблема заключалась в том, что когда он возвращал объект UIBarButtonItem, если он был назначен константе, тип константы - «() -> UIBarButtonItem» или в зависимости от того, как настроен переключатель, выходят как «(Button) -> UIBarButtonItem». Я не уверен, что означает символ «->» в этом случае. Почему он не полностью переходит в класс? Что здесь происходит? В учебнике прямо перед этим, похоже, мы сделали то же самое, поэтому я не уверен, почему он не работает.

enum Button { 
    case Done(String) 
    case Edit(String) 

func toUIBarButtonItem() -> UIBarButtonItem { 
    switch self { 
    case .Done: return UIBarButtonItem(title: "Done", style: .Done, target: nil, action: nil) 
    case .Edit: return UIBarButtonItem(title: "Plain", style: .Plain, target: nil, action: nil) 
     } 
    } 
} 

let done = Button.Done("Done") 
let doneButton = Button.toUIBarButtonItem(done) 

Это код, который я запускаю, не включая класс UIBarButtonItem. Надеюсь, это достаточно информации, чтобы понять, о чем я прошу.

+0

Alright, так почему переменная держать функцию вместо предполагаемого объекта, если эта функция возвращает объект? Отредактировал сообщение, чтобы показать код, если это поможет. – Resistant

+0

Да, спасибо, я понял, что я не называл это на экземпляре, но это было потому, что, прежде чем мне нужно было его передать, я не думал, что имеет смысл называть это сам, а затем также передавать его. как только я сменил переключатель на себя, это имело больше смысла, я просто никогда не менял часть, на которой я ее называл. Это все еще позволяло мне пройти, даже если больше не указано, что есть аргумент. Удивленный, он не сделал никаких ошибок, но, по крайней мере, я понимаю сейчас, спасибо за помощь! – Resistant

ответ

1

Вы вызываете метод toUIBarButtonItem() по типу Button вместо экземпляра Button; поэтому он делает что-то особенное: он возвращает валютную функцию, которую вы затем связываете с done. Результат, однако, по-прежнему является функцией.

То, что вы, вероятно, означает сделать, это вызвать метод вашего done объекта:

let done = Button.Done("Done") 
let doneButton = done.toUIBarButtonItem() 

Более углубленное объяснение можно найти в разделе http://oleb.net/blog/2014/07/swift-instance-methods-curried-functions/

+0

Хорошо, теперь я понимаю. Первоначально у меня была функция toUIBarButtonItem, использующая тип Button, что означало, что я должен был передать завершенный объект в качестве параметра, поэтому я был смущен тем, как я собираюсь называть этот метод на нем, поэтому я просто передал его в функцию , Мне нужен объект Button для коммутатора, но потом я понял, что могу просто удалить его и включить себя. Итак, остальная часть моего кода осталась прежней, но, я думаю, я забыл, что мне больше не нужно ничего проходить. Я удивлен, что xcode разрешил мне даже передать это, когда аргументы не были указаны. Благодаря! – Resistant

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