2016-12-09 2 views
0

Это довольно просто, я уверен, что чего-то не хватает.Хранение Блок кода внутри переменной

Я пытаюсь понять, как достичь следующего: action должен «удерживать» блок кода, который я, в конечном счете, выполним внутри UIView.animate (например).

Каков правильный путь? + Должен ли я беспокоиться об использовании self. с точки зрения сохранения цикла внутри action закрытие? Функция

Пример:

func forward(_ sender : UIButton) { 

var action : <Clousre of somekind?> 

switch currentPosition 
    { 
    case 0 : action = { self.view.background = .red } 
    case 1 : action = { self.view.background = .blue } 
    default : fatalError("No current Position") 
    } 

UIView.animate(withDuration: 1, animations: { 
    action 
    }) 
} 

Спасибо! :)

ответ

1

не Объявите это так:

var action:() -> Void 

Существует не сохраняет цикл.

self не содержит ссылки на action.

Если action бы свойство (вне функции) было бы сохранить цикл:

< self.action ->action = { self... }

Соединенный:

var action :() -> Void 

switch currentPosition { 
    case 0 : action = { /*do something*/ } 
    case 1 : action = { /*do something*/ } 
    default : fatalError("No current Position") 
} 

UIView.animate(withDuration: 1, animations: { 
    action() 
}) 

// or 

UIView.animate(withDuration: 1, animations: action) 

(отлично компилируется в Детская площадка)

+0

Но я сначала объявляю его наружу, потому что я назначаю его только внутри области переключения. Каким будет его тип? aka var action: !? –

+0

Обновленный ответ. – shallowThought

+0

Дайте мне ошибку: пропавший без вести возврат в закрытии ожидается возвращение «Пустота!» –

0

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

var action: (() ->()) 
// or, if you want action to be optional: 
var action: (() ->())? 

EDIT: Изначально я писал, что вы должны использовать [weak self], чтобы избежать сохранения циклов, как я не заметил action был объявлен внутри функции. Так как он находится внутри функции, action освободится после выполнения функции, поэтому цикл сохранения не будет.

+0

Благодарим за решение проблемы сохранения циклов. Выглядит неплохо! Единственная проблема заключается в том, что внутри блока я обращаюсь к «let commonHeight: CGFloat! = 171. Но когда я обращаюсь к нему внутри закрытия, aka: self? .commonHeight. Это дает мне ошибку: значение дополнительного типа «CGFloat?» не разворачивается; вы хотели использовать '!' или '?'? ,Есть идеи? –

+0

Причина, по которой вы делаете «слабое само», заключается в том, что «self» разрешено освобождать. Если сам освобождается (т.е. ничто не указывает на него), то я здесь нет. Вы можете развернуть 'self' в блоке с чем-то вроде' if let wSelf = self {...} 'или вы можете просто развернуть float с помощью' if let height = self? .commonHeight {...} '. – Connor

+0

shallowThought просто указал правильно, что нет цикла удержания. Я не заметил, что «действие» находилось внутри функции. – Connor