2017-01-27 2 views
1

Я использую Swift 3.0. У меня есть следующий код:Математический расчет для ImplicitlyUnwrappedOptional Значения

var double1 : Double! = 1.0 
var double2 : Double! = 2.0 
var double3 : Double! = 3.0 

Когда я попытался сделать расчет, как это:

let result = double1-double2-double3 

Компилятор дал мне ошибку:
бинарный оператор «-» не может быть применяется к операндам типа «Двойной» и «Двойной!»

Я узнал, что double1-double2 приведет к двойному значению, поэтому не может выполнить математику с помощью Double!

Затем я попробовал:

let result = double1! - double2! - double3! 

Компилятор дал мне эту ошибку:
неоднозначную ссылку на член «-»

Итак, что правильная грамматика для этого?

+2

Я считаю, что это на самом деле ошибка, но я не могу найти дубликат прямо сейчас. – Sulthan

+0

Какова практическая польза для использования опций в этом случае? Вы не должны использовать неявные развернутые необязательные значения вообще в линиях объявлений, где назначается значение по умолчанию. Тем не менее, с точки зрения арифметики, в любом случае «нильское» состояние отсутствует. – vadian

+0

[Сообщение об ошибке (SR-1122)] (https://bugs.swift.org/browse/SR-1122) (разрешено, больше не должно быть проблемой в Swift 3.1). – dfri

ответ

2

Добавьте эти пользовательский оператор перегрузки к вашему проекту:

public func + <T: FloatingPoint>(lhs: T!, rhs: T!) -> T! 
{ 
    if let lhs = lhs, let rhs = rhs 
    { 
     return lhs + rhs 
    } 

    return nil 
} 

public func - <T: FloatingPoint>(lhs: T!, rhs: T!) -> T! 
{ 
    if let lhs = lhs, let rhs = rhs 
    { 
     return lhs - rhs 
    } 

    return nil 
} 

public func * <T: FloatingPoint>(lhs: T!, rhs: T!) -> T! 
{ 
    if let lhs = lhs, let rhs = rhs 
    { 
     return lhs * rhs 
    } 

    return nil 
} 

public func/<T: FloatingPoint>(lhs: T!, rhs: T!) -> T! 
{ 
    if let lhs = lhs, let rhs = rhs 
    { 
     return lhs/rhs 
    } 

    return nil 
} 

Это позволит за то, что вы пытаетесь:

var double1 : Double! = 1.0 
var double2 : Double! = 2.0 
var double3 : Double! = 3.0 

let result = double1 - double2 - double3 // -4 

И, в качестве бонуса, это будет работать с любым произвольным FloatingPoint типа (включая Float и Float80).

+0

Ницца.Возможно, также добавьте 'lhs: T !, rhs: T' и' lhs: T, rhs: T! '. – shallowThought

1

Одним из возможного временного решения:

let result = (double1 - double2) as Double - double3 

Или просто бросить свои двойники, не являющиеся дополнительные опции. Вы знаете, что вы действительно не можете выполнять операции над значениями nil, правильно?

+0

Спасибо. Я нашел другое решение: let result = Double (double1) - Double (double2) - Double (double3). Хорошо ... Оказывается, это ошибка ... – kilik52

0

Хорошо, я нашел одно решение. Я могу использовать:

let result = Double(double1) - Double(double2) - Double(double3) 

Но код выглядит антигуманно. Есть ли более элегантный способ сделать это?

0

Определите Double сек в Double:

var double1 : Double = 1.0 
var double2 : Double = 2.0 
var double3 : Double = 3.0 

типа также можно сделать вывод:

var double1 = 1.0 
var double2 = 2.0 
var double3 = 3.0 
+0

Пример для простоты. Я использую ObjectMapper, поэтому мне нужно объявить переменные класса с помощью Double! – kilik52

+0

@ kilik52: Мой ответ решает проблему оператора вычитания. Разве это не то, что вы хотели? –

+0

@ Ватсал Мано: нет, это не так. Я должен определить мой «Двойной» как «Двойной!». вы не можете это изменить. – kilik52

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