Я делаю что-то действительно простое, чтобы привыкнуть к Swift (исходя из objc) - я хочу вернуть желаемый узел в связанном списке, используя оператор guard
и оператор switch
. Очевидно, я неправильно использую оператор guard
, потому что мой оператор else
огромен (именно там хранится мой оператор switch). Возможно, мне даже не нужен оператор switch
, но он просто немного проясняет ситуацию.
Мой старый код выглядит следующим образом:
func getValue (atIndex index: Int) -> T {
if count < index || index < 0 {
print ("index is outside of possible range")
}
var root = self.head
// if var root = self.head {
if index == 0 {
return (self.head?.value)!
}
if index == count-1 {
return (self.tail?.value)!
}
else {
for _ in 0...index-1 {
root = root!.next!
}
}
return root!.value
}
Заменено на оператор guard
(но получаю ошибку компилятора, из-за которой тело защиты может не провалиться) - моя проблема в том, что возвращать, поскольку тип возвращаемого значения моей функции - <T>
(любой тип).
func getValue (atIndex index: Int) -> T {
guard (count < index || index < 0) else {
switch true {
case index == 0:
if let head = self.head {
return head.value
}
case index == count-1:
if let tail = self.tail {
return tail.value
}
default:
if var currentNode = head {
for _ in 0...index-1 {
currentNode = currentNode.next!
}
return currentNode.value
}
}
}
}
Я хотел бы добавить оператор print
вне моего оператора guard
, говорящий, что желаемый индекс находится за пределами диапазона, но мне также нужно что-то вернуть в конце функции типа T
. Проблема в том, что за пределами моего оператора guard
и switch мне нечего возвращать.
return
,throw
и т. д.). Поэтому код успеха должен идти сразу после охранника. Кроме того, переключениеtrue
не имеет смысла, конечно, переключениеindex
имело бы больше смысла, поскольку это то, что вы сравниваете? И что такоеT
? Ваша функция не является универсальной, это универсальный класс? - person Hamish   schedule 25.05.2016index
в качестве случаев, то естьcase 0
,case count-1
. - person Hamish   schedule 26.05.2016getValue
, похоже, извлекает элемент из связанного списка. Вместо того, чтобы исправлять имя в соответствии со стандартами (как это сделал CharlesA, переименовав его вgetValueAtIndex
), я бы просто сделал егоsubscript
. Во-вторых,switch true {...}
избыточен. На самом деле я бы потерял операторыif
и использовал значимые значенияcase
вswitch index { ... }
. В-третьих, в вашем коде есть пути, по которым вы не возвращаете значение. Например, см. gist.github.com/robertmryan/4286f243169b1394f0f31d4659a03e5b. - person Rob   schedule 26.05.2016