Например, UIView
определяет метод класса с этой сигнатурой :
class func animateWithDuration(duration: NSTimeInterval, animations: () -> Void)
Итак, вы можете называть это следующим образом:
UIView.animateWithDuration(0.2, animations: {
self.view.alpha = 0
})
или вы можете вызвать его с закрывающим замыканием, например:
UIView.animateWithDuration(0.2) {
self.view.alpha = 0
}
Обратите внимание, что с завершающим замыканием вы полностью опускаете ключевое слово (animations:
) последнего аргумента.
Вы можете использовать только закрывающее закрытие для самого последнего аргумента функции. Например, если вы используете UIView.animateWithDuration(animations:completion:)
, вы должны поместить блок animations:
в круглые скобки, но вы можете использовать трейлинг-закрытие для блока completion:
.
(result, error)
part объявляет имена аргументов блоку. Я выхожу, что метод update
имеет подписи примерно так: func update(completedItem: NSMutableDictionary,
completion: (NSData!, NSError!) -> Void)
Таким образом, он вызывает блок завершения с двумя аргументами. Для доступа к этим аргументам блок дает им имена result
и error
. Вам не нужно указывать типы аргументов, потому что компилятор может выводить типы на основе декларации update
.
Обратите внимание, что вы фактически можете опустить имена аргументов и использовать сокращенные имена $0
и $1
:
self.table!.update(completedItem) {
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
if $1 != nil {
println("Error: " + $1.description)
return
}
self.records.removeAtIndex(indexPath.row)
self.tableView.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Automatic)
}
Вы можете узнать больше о замыканиях, прочитав «Закрытие» на языке Swift .
Я создал миксины для этого сейчас и
class ChangeFieldNamesMixin(models.Model):
def __init__(self, *args, **kwargs):
model_fields = self._meta.get_fields()
initialise_texts(self._meta.model_name, model_fields)
super(ChangeFieldNamesMixin, self).__init__(*args, **kwargs)
class Meta:
abstract = Trueenter code here
def initialise_texts(name, model_fields):
model_field_name = name + 'Field'
Model = apps.get_model("custom", model_field_name)
field_names_to_create = []
field_dict = compose_field_dict(name, Model)
# create entries in table if empty
if len(field_dict) == 0:
for entry in model_fields:
if entry.editable:
attrs = {'name': entry.name, 'help_text': entry.help_text, 'label': entry.verbose_name}
new_entry = Model(**attrs)
field_names_to_create.append(new_entry)
print('Saving {}'.format(new_entry))
field_list = Model.objects.bulk_create(field_names_to_create)
compose_field_dict(name, Model, field_list)
else:
for entry in model_fields:
if entry.editable:
key = entry.name
if key in field_dict.keys():
setattr(entry, 'verbose_name', field_dict[key].label)
setattr(entry, 'help_text', field_dict[key].help_text)
Я не слишком рад этому решению, потому что я думаю, что должен быть лучший способ инициализировать поля в базе данных. Я довольно новичок в разработке django и python (более опытный в Java), поэтому некоторые отзывы будут оценены.