web-dev-qa-db-ja.com

プロトコル内のネストされた型

次のように、プロトコル内でネストされた型を宣言することができます。

protocol Nested {

    class NameOfClass {
        var property: String { get set }
    }
}

Xcodeは言う"ここではタイプは許可されていません"

タイプ「NameOfClass」はプロトコル「Nested」でネストできません

ネストされた型を必要とするプロトコルを作成したいと思います。これは不可能ですか、別の方法でこれを行うことができますか?

20
LettersBa

プロトコルはネストされたタイプを要求できませんが、別のプロトコルに準拠する関連タイプを要求することができます。実装では、この要件を満たすために、ネストされた型または型エイリアスを使用できます。

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
}
24
ughoavgfhw

または、別のプロトコルに準拠するプロトコル内にインスタンス/タイププロパティを含めることができます。

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)
1
Stephenye

これがあなたのコードですが、うまくいく方法で:

protocol Nested {
    associatedtype NameOfClass: HasStringProperty

}
protocol HasStringProperty {
    var property: String { get set }
}

そして、あなたはこのようにそれを使うことができます

class Test: Nested {
    class NameOfClass: HasStringProperty {
        var property: String = "Something"
    }
}

お役に立てれば!

0
Ben Leggiero