2016-03-16 4 views
1

В моем коде я проверяю, равна ли системная функция нулю или нет, если да, я возвращаю другое значение, если нет, возвращаю проверенное значение.Swift Ternary, возвращаемое тестируемое значение

(class.verylongfunc(arg, arg) == 0) ? othervar : class.verylongfunc(arg, arg) 

Это лучший и чистый способ сделать это? Я не хочу, чтобы вызвать функцию в два раза ... Я знаю, что могу сделать

let tmp = class.verylongfunc(arg, arg) 
    (tmp == 0) ? othervar : tmp 

Но взять две строки ...

+0

Это не проблема, кстати, это просто я хочу, чтобы мой код понятнее – 1L30

+1

меньше строк кода не равен код фильтра. – ryantxr

ответ

3

ли вы контролировать verylongfunc? Если да, то 0 - особый случай, означающий какой-то отказ или невозможность возврата? Если да, то он вернется ноль, то вы можете сделать

class.verylongfunc(arg, arg) ?? othervar 

Если нет, то сделать свой собственный оператор:

infix operator ??? {} 
func ???(num: Int32, defNum: Int32) -> Int32 { 
    if num == 0 { 
     return defNum 
    } 
    return num 
} 
+0

func is «func collectionView (collectionView: UICollectionView, numberOfItemsInSection раздел: Int) -> Int» Ваш ответ довольно хорош в некотором роде, но если я делаю другой func, который вызывает это, я не могу сделать что – 1L30

+0

@ 1L30 В этом случае вам не нужно * запрашивать * представление коллекции, сколько элементов находится в разделе ... вы должны просто иметь возможность посмотреть на свою модель данных и * знать * –

+0

Я действительно прошу мой суперкласс , Я в дочернем классе – 1L30

1

Чтобы расширить на ответ Лу Франко, если вы не контролируете verylongfunc, вам можно обернуть системную функцию в функцию, которая делает возврата опциональный:

func value() -> Int? { 
    let value = Class.verylongfunc() 
    return value == 0 ? nil : value 
} 

Затем вы можете использовать его как это:

let otherVar = 123 
let x = value() ?? otherVar 
+0

это не намного чище, чем просто использование тернарного – FruitAddict

+0

Вы правы, я могу это сделать, но не переместите проблему в другом func с возвращаемым значением == 0? nil: значение ? – 1L30

+1

Согласен. Это полезно, если вы будете называть 'value()' из многих мест, иначе абстракция бессмысленна. –

4

Самый чистый способ?

let value = someLongFunc() 

if value == 0 { 
    return otherValue 
} else { 
    return value 
} 

Я гарантирую, что все, кто его прочитает, поймут это без каких-либо вторых мыслей. Вы могли бы сделать некоторые операторы или вспомогательные функции, но что такое «чистый путь»? Меньше строк кода? Я категорически не согласен с этим. Читаемость гораздо важнее в «чистом коде», чем взламывание одного лайнера, и только ужасные люди злоупотребляют тройными операторами.

2

Другое решение одной линии.

let result = { $0 == 0 ? othervar : $0 }(class.verylongfunc(arg, arg)) 
Смежные вопросы