2014-11-10 2 views
2

Могу ли я использовать опциональную привязку в качестве ссылок? Если да, как я могу это сделать?Дополнительные привязки и ссылки

Следующий код сортирует копию self.threadsInfo?.threads?, а не оригинал.

if var threads = self.threadsInfo?.threads? { 
      switch self.threadsSortType 
      { 
      case .Score: 
       threads.sort { 
        $0.score > $1.score 
       } 
      case .Views: 
       threads.sort { 
        $0.views > $1.views 
       } 
      case .PostsCount: 
       threads.sort { 
        $0.postsCount > $1.postsCount 
       } 
      default: 
       assert(false, "Unknown threads sort type") 
      } 
     } 

Заранее благодарен.

ответ

3

Массивы типа значения поэтому его копируются здесь:

var threads = self.threadsInfo?.threads? 

Вы можете назначить отсортированный массив обратно к оригиналу:

if var threads = self.threadsInfo?.threads? { 
      switch self.threadsSortType 
      { 
      case .Score: 
       threads.sort { 
        $0.score > $1.score 
       } 
      case .Views: 
       threads.sort { 
        $0.views > $1.views 
       } 
      case .PostsCount: 
       threads.sort { 
        $0.postsCount > $1.postsCount 
       } 
      default: 
       assert(false, "Unknown threads sort type") 
      } 

      self.threadsInfo?.threads = threads 
     } 
3

Вы можете перемещать сортировочную логику в отдельную функцию приняв не факультативно массив по запросу:

func sort(inout threads: [MyThreadType]) { 
    switch self.threadsSortType { 
    case .Score: 
     threads.sort { 
      $0.score > $1.score 
     } 

    case .Views: 
     threads.sort { 
      $0.views > $1.views 
     } 

    case .PostsCount: 
     threads.sort { 
      $0.postsCount > $1.postsCount 
     } 

    default: 
     assert(false, "Unknown threads sort type") 
    } 
} 

И звоните:

if self.threadsInfo?.threads != nil { 
    sort(&self.threadsInfo!.threads!) 
} 

Типы значений всегда передаются по значению (т. по копиям). Единственный случай, когда они могут быть переданы по ссылке, - это функция/методы с помощью модификатора inout.

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