Почему люди добавляют 0 на CGFloat? - PullRequest
0 голосов
/ 12 апреля 2020

https://developer.apple.com/library/archive/referencelibrary/GettingStarted/DevelopiOSAppsSwift/ImplementingACustomControl.html# // apple_ref / doc / uid / TP40015214-CH19-SW1 В этом уроке константа

button.widthAnchor.constraint(equalToConstant: 44.0).isActive = true

набирается "44.0", а не "44".

Есть ли какая-то разница между ними?

Я измерил время методов.

func evaluateProblem(problemNumber: Int, problemBlock: () -> Void)
{
    print("Evaluating problem \(problemNumber)")

    let start = DispatchTime.now() // <<<<<<<<<< Start time
    let end = DispatchTime.now()   // <<<<<<<<<<   end time

    let nanoTime = end.uptimeNanoseconds - start.uptimeNanoseconds // <<<<< Difference in nano seconds (UInt64)

    print("Time to evaluate problem \(problemNumber): \(nanoTime)")
}

evaluateProblem(problemNumber: 2) {
    let b: CGFloat = 44
    print(b)
}

evaluateProblem(problemNumber: 1) {
    let a: CGFloat = 44.0
    print(a)
}

Но более быстрый не фиксирован.

1 Ответ

1 голос
/ 12 апреля 2020

Вы можете инициализировать Double, Float, CGFloat, Int, et c. с целочисленными литералами, потому что все вышеперечисленное соответствует протоколу ExpressibleByIntegerLiteral . За кулисами инициализация литералом просто вызывает метод init(integerLiteral:) соответствующего типа.

Аналогично, существует протокол ExpressibleByFloatLiteral , который обрабатывает инициализацию с литералами с плавающей запятой, и этот протокол имеет инициализатор, который также должен быть реализован с помощью соответствующих типов.

Что касается использования, это вопрос личных предпочтений и стиля. Оба способа инициализации действительны, и если вы не выполните тысячи инициализаций, разница в производительности будет незначительной.

...