Я пытаюсь создать протокол, раскрывающий статическое свойство, а затем использовать это статическое свойство в расширении этого протокола, но, похоже, это работает, только если я также определяю это статическое свойство в расширении протокола. В основном код, который я пытаюсь заставить работать:
protocol NibInstantiable: class {
static var bundle: Bundle? { get }
static var nibName: String { get }
}
extension NibInstantiable where Self: UIViewController {
// static var nibName: String {
// return ""
// }
static func instantiate() -> Self {
return Self(nibName: Self.nibName, bundle: Self.bundle ?? Bundle.main)
}
}
Раньше это работало в основном как есть в Swift 2, но это уже не так в Swift 3. Я могу заставить его работать, раскомментировав свойство nibName
в расширении протокола, но это подавит предупреждения компилятора, если я забуду определить это свойство в классах, реализующих этот протокол.
Есть идеи, что мне не хватает? Спасибо !
РЕДАКТИРОВАТЬ: Для справки, вот версия этого кода Swift 2.3, которая компилируется и работает без каких-либо проблем:
protocol Instantiable {
static var bundle: NSBundle? { get }
static func instantiate() -> Self
}
extension Instantiable {
static var bundle: NSBundle? {
return NSBundle.mainBundle()
}
}
// MARK: With Nib
protocol NibInstantiable: Instantiable {
static var nibName: String { get }
}
extension NibInstantiable where Self: UIViewController {
static func instantiate() -> Self {
return Self(nibName: Self.nibName, bundle: Self.bundle ?? NSBundle.mainBundle())
}
}
bundle
имеет типString
? Попробуйте добавить актуальный код, это поможет нам решить ваши проблемы. Любое изменение может привести к дополнительным ошибкам. - person user28434'mstep   schedule 26.12.2016Bundle?
(сейчас исправлено). На самом деле здесь нет ничего, кроме фрагмента. - person axelcdv   schedule 26.12.2016UIViewController
nibName
и вашим требованием статического свойстваnibName
. См. этот связанный отчет об ошибке. Простое решение — просто переименовать статическоеnibName
требование. . - person Hamish   schedule 26.12.2016