2016-01-15 4 views
0

Возникают проблемы с использованием быстрого протокола для упрощения UIPageViewController:поведение Странной Swift Протокола

У меня есть этот протокол

protocol Pagable { 
    var pageIndex: Int? { get set } 
} 

, которые у меня есть все мое UIViewControllers быть представлены UIPageViewController соответствовать.

Тогда в моем UIPageViewController, я делаю это:

var vc = StoryboardScene.Challenges.acceptedViewController() as! Pagable 
vc.pageIndex = index 
return vc as? UIViewController 

, который работает, но то, что я действительно хочу сделать, это:

var vc = StoryboardScene.Challenges.acceptedViewController() 
(vc as? Pagable)?.pageIndex = index 
return vc 

и по какой-то причине, когда я делаю что вместо (который мне кажется абсолютно таким же, как и фрагмент 1), я получаю сообщение об ошибке (vc as? Pagable)?.pageIndex = index, в котором говорится: «Невозможно назначить неизменяемое выражение типа Int?».

Я полностью смущен. Хотелось бы узнать некоторое понимание того, почему система типов делает это со мной.

+1

попробуйте 'if let vc = StoryboardScene.Challenges.acceptedViewController() как? Pagable {vc.pageIndex = index; return vc} ' –

+0

Если * все мои UIViewControllers ... соответствуют *, в чем цель использования дополнительных привязок? И почему опция 'pageIndex' необязательна? – vadian

+0

Я понимаю, что я пытался сделать, это не лучшая практика, реорганизованная на лучший способ сделать это (превращение 'pageIndex' в константу и назначение в дочернем VC). Но мне все же хотелось бы понять, почему '(vc as? Pagable) ?. pageIndex = index' не допускается – AndrewSB

ответ

3

В

var vc = StoryboardScene.Challenges.acceptedViewController() 
(vc as? Pagable)?.pageIndex = index 

vc является переменной, но (vc as? Pagable) является неизменяемым выражением.

Решение объявить «класс только протокол»:

protocol Pagable : class { 
    var pageIndex: Int? { get set } 
} 

Тогда компилятор знает, что все соответствующие типы ссылочные типы, так, что свойство может быть назначено, даже если ссылка сама постоянна.

+0

Побей меня. :) – matt

+0

, что имеет прекрасный смысл, спасибо! Является ли '(vc as? Pagable)' сокращенным для синтаксиса 'if let'? – AndrewSB

+0

@AndrewSB: Нет. Как я понимаю, оператор 'as?' Возвращает новое (неизменяемое) выражение. Вот более простой пример: 'var x = 123; x = 456' компилирует, но 'var x = 123; (x as Int) = 456'. –

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