2016-09-16 2 views
3
var a: CGFloat! 
var b: CGFloat! 
var c: CGFloat! 

После инициализации затемIOS Добавление несколько необязательного значения в Swift3

let x = a + b + c 

Xcode8 покажет

бинарного оператора '+' не может быть применена к операндам типа 'CGFloat' и ' CGFloat!

догадка сначала добавить два из них сделал эту ошибку

Может быть, я мог бы использовать первый добавить одну, а затем добавить третий исправить

Но это изменит мою х к вар и не сжатыми мимо

Любое предложение?


Edit: должны несколько сценариев приложений мы могли бы сталкиваются, я написал эту простую демонстрацию только 4 выразить этот вопрос :)

+0

вы должны не делать что-то вроде этого Var: с CGFloat? вместо var a: CGFloat! ? –

+1

Кажется, это ошибка для меня. Простое обходное решение 'let x = 0 + a + b + c'. – OOPer

+0

@UmairAfzal Я использую форсирующую распаковку (!) Для удобства (слишком много ненужного let x = необязательно всегда быть скучным :(), И поскольку этот синтаксис все еще не устарел. Я думаю, что должен быть краткий способ сделать это ...:) – d0ye

ответ

0

Похоже, добавление + б производит CGFloat, а затем не компилятор конечно, как добавить c, который имеет тип CGFloat!

Если вы определяете c как var c: CGFloat = 0 (только для эксперимента) - тот же код будет скомпилирован.

я нашел еще два способа суммирования этого 3 переменные:

let x = a.advanced(by: b + c) 

или

let y = CGFloat(a + b) + c 

И выглядит не круто, как для меня, но, по крайней мере, компилятор теперь понимаю, как добавить эти ценности. Возможно, это ошибка Swift, и скоро будет исправлено.

0
import CoreGraphics 

var a: CGFloat! = 1 
var b: CGFloat! = 2 
var c: CGFloat! = 3 

if let a:CGFloat=a, let b:CGFloat=b, let c:CGFloat=c 
{ 
    let x = a + b + c 
} 
else 
{ 
    print("at least one of them was nil") 
} 

Определение их как CGFloat! говорит, что они УСТРОЙСТВО, но вы знаете, что они будут содержать значение в точке, что вы будете использовать их.

let a:CGFloat=a разворачивает в новую CGFloat (не CGFloat - новый один не является факультативным)

Это ошибка времени выполнения, если она не содержит значение, поэтому if обрабатывает эту ситуацию.

Обратите внимание, что a внутри тела, если он скрывает снаружи - это не тот же объект.

отметить также, что вам не нужны типы, где вы разворачивать их - они будут автоматически CGFloat (Спасибо @NRitH)

+0

Нет необходимости указывать ': CGFloat' в каждом из выражений' if let'. – NRitH

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