Вложенные типы внутри протокола
Можно объявить вложенные типы внутри протоколов, например:
protocol Nested {
class NameOfClass {
var property: String { get set }
}
}
Xcode говорит "Тип здесь не разрешен":
Тип "NameOfClass" не может быть вложенным в протокол "Nested"
Я хочу создать протокол, который должен иметь вложенный тип. Это невозможно или я могу сделать это другим способом?
Ответы
Ответ 1
Протокол не может требовать вложенного типа, но для него может потребоваться связанный тип, соответствующий другому протоколу. Реализация может использовать либо вложенный тип, либо псевдоним типа для удовлетворения этого требования.
protocol Inner {
var property: String { get set }
}
protocol Outer {
associatedtype Nested: Inner
}
class MyClass: Outer {
struct Nested: Inner {
var property: String = ""
}
}
struct NotNested: Inner {
var property: String = ""
}
class MyOtherClass: Outer {
typealias Nested = NotNested
}
Ответ 2
В качестве альтернативы вы можете иметь свойства экземпляра/типа внутри протокола, которые соответствуют другому протоколу:
public protocol InnerProtocol {
static var staticText: String {get}
var text: String {get}
}
public protocol OuterProtocol {
static var staticInner: InnerProtocol.Type {get}
var inner: InnerProtocol {get}
}
public struct MyStruct: OuterProtocol {
public static var staticInner: InnerProtocol.Type = Inner.self
public var inner: InnerProtocol = Inner()
private struct Inner: InnerProtocol {
public static var staticText: String {
return "inner static text"
}
public var text = "inner text"
}
}
// for instance properties
let mystruct = MyStruct()
print(mystruct.inner.text)
// for type properties
let mystruct2: MyStruct.Type = MyStruct.self
print(mystruct2.staticInner.staticText)
Ответ 3
Вот ваш код, но таким образом, который работает:
protocol Nested {
associatedtype NameOfClass: HasStringProperty
}
protocol HasStringProperty {
var property: String { get set }
}
И вы можете использовать его так:
class Test: Nested {
class NameOfClass: HasStringProperty {
var property: String = "Something"
}
}
Надеюсь, это поможет!