Для удобства я добавил расширение в свой собственный файл
import UIKit
public extension UIWindow {
func capture() -> UIImage {
UIGraphicsBeginImageContextWithOptions(self.frame.size, self.opaque, UIScreen.mainScreen().scale)
self.layer.renderInContext(UIGraphicsGetCurrentContext()!)
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return image
}
}
, вызвав расширение следующим образом:
let window: UIWindow! = UIApplication.sharedApplication().keyWindow
let windowImage = window.capture()
Аналогичным образом можно было расширить UIView для захвата образ этого ....
Очень хорошее развивает вопрос. Я рассматриваю null
действительно специальное значение, и если метод может возвратиться null
, он должен ясно зарегистрировать в Javadoc, когда он делает (@return some value ..., or null if ...
). При кодировании я являюсь защитным, и предполагаю, что метод может возвратиться null
, если я не убежден, что он не может (например, потому что Javadoc заявил так.)
Люди поняли, что это - проблема, и предлагаемое решение должно использовать аннотации для утверждения намерения способом, это может быть проверено автоматически. См. JSR 305: Аннотации для Обнаружения Дефекта программного обеспечения , JSR 308: Аннотации на Типы и Java практическое руководство JetBrain Nullable .
Ваш пример мог бы быть похожим на это и отказался IDE, компилятором или другими инструментами анализа кода.
@NotNull
public Object methodWhichCannotReturnNull(int i) throws Exception
{
return null; // this would lead to a compiler error!
}
Можно использовать Option
тип, который очень похож на список, который имеет нуль или один элемент. Тип возврата Option<Object>
указывает, что метод может возвратиться Object
, или это может возвратить специальное значение типа None
. Этот тип является заменой для использования пустого указателя с лучшими проверками типа.
Пример:
public Option<Integer> parseInt(String s) {
try {
return Option.some(Integer.parseInt(s));
}
catch (Exception e) {
return Option.none();
}
}
при использовании этого последовательно можно включить пустые предупреждения IDE, или просто использовать grep для null
, который не должен появляться в коде вообще, если бы Вы используете Option.none()
везде, Вы обычно использовали бы null
литерал.
Option
прибывает стандарт с Scala, и это называют Maybe
в Haskell. Ссылка выше к библиотеке, названной Функциональный Java, который включает ее. Та версия реализует эти Iterable
интерфейс и имеет одноместные методы, которые позволяют Вам составить вещи приятно. Например, для обеспечения значения по умолчанию 0 в случае [1 114]:
int x = optionalInt.orSome(0);
И можно заменить это...
if (myString != null && !"".equals(myString))
... с этим, если Вы имеете Option<String>
...
for (String s : myOptionString)
Действительно: в нашей платформе у нас есть 'непустой' тип указателя, который может быть возвращен, чтобы указать, что метод будет всегда возвращать значение.
я вижу три опции:
Для Java можно использовать описание Javadoc метода для документирования значения возвращенного значения, включая то, может ли это быть пустым. Как был упомянут, аннотации могут также оказать помощь здесь.
, С другой стороны, я признаю, что не рассматриваю пустой указатель как что-то, чтобы бояться. Существуют ситуации, в которых "ничей дом" является значимым условием (хотя метод Несуществующего объекта также имеет действительное значение здесь).
Это, конечно, верно, что попытка вызова метода на нулевом значении вызовет исключение. Но так будет попытка разделиться на нуль. Это не означает, что мы должны продолжить, кампания для устранения обнуляет! Это просто означает, что мы должны понять контракт на методе и сделать правильную вещь со значениями, которые это возвращает.
Вы могли записать свою собственную аннотацию (Java) или атрибут (C#), чтобы указать, что возвращаемое значение могло бы быть пустым. Ничто автоматически не проверит его (хотя.NET 4.0 будет иметь контракты кода для этого вида вещи), но это, по крайней мере, действовало бы как документация.
Существует некоторая поддержка @Nullable и @NotNull аннотация в ИДЕЕ IntelliJ . Существует также некоторый разговор о добавлении тех аннотаций (или подобная функция) к Java 7. К сожалению, я не знаю, как далеко это добралось или если это все еще на ходу вообще.
Возможно, Вы могли определить универсальный класс по имени "NotNull", так, чтобы Ваш метод мог бы быть похожим:
public NotNull<Object> methodWhichCannotReturnNull(int i) throws Exception
{
// the following would lead to a run-time error thown by the
// NotNull constructor, if it's constructed with a null value
return new NotNull<Object>(null);
}
Это - все еще время выполнения (не время компиляции) проверка, но:
NotNull<T>
как тип возврата) Любой ценой постарайтесь не полагаться на JavaDocs. Люди только читают их, если подпись не будет казаться тривиальной и очевидной (Который плох для начала), и они, кто на самом деле потрудился читать их, то менее вероятно, сделают ошибку с пустыми указателями, так как они в настоящее время более осторожны.
При использовании Java 5 + можно использовать пользовательскую Аннотацию, например, ОБНОВЛЕНИЕ @MayReturnNull
Вся философия кодирования в стороне (возвращающийся пустой указатель, с помощью исключений, утверждений, yada yada), я надеюсь, что вышеупомянутое отвечает вопрос. Кроме примитивов, имеющих значения по умолчанию, составные типы могут или не могут быть пустыми, и Ваш код должен иметь дело с ним.
Вообще говоря, я предположил бы, что пустое возвращаемое значение против контракта API по умолчанию. Почти всегда возможно разработать Ваш код, таким образом, что нулевое значение никогда не возвращается из Ваших API во время "нормального" потока выполнения. (Например, проверьте foo.contains (obj) скорее тогда звонящий foo.get (obj) и имеющий отдельное ответвление для пустого указателя. Или, используйте шаблон Несуществующего объекта .
, Если бы Вы не можете разработать свой API таким способом, я ясно зарегистрировал бы, когда и почему пустой указатель мог быть брошен - в наименьшее количество в Javadoc, и возможно также использование пользовательского @annotation, такого как несколько из других ответов предложило.