0

このアプリでカットアンドペースト コードを減らすために、クラス名を渡して、データを処理する方法をメソッドに伝えようとしています。私は次のようなものを持っています:

class MyClass : NSObject {
    var name : String = ""
}

class OneClass : MyClass {
    override init() {
        super.init()
        self.name = "One"
    }
}

class TwoClass : MyClass {
    override init() {
        super.init()
        self.name = "Two"
    }
}


class Thing : NSObject {
    func doStuff(withClass cls: AnyClass) -> String {
        let x = cls.init()
        return x.name
    }
}

let z = Thing()
print(z.doStuff(withClass: OneClass))
print(z.doStuff(withClass: TwoClass))

withClass cls: AnyClassパーサーを渡すと、に変更let x = cls()するようになりましたlet x = cls.init()。しかしExpected member name or constructor call after type name、最後の 2 行でエラーが発生しました。推奨される修正は、どちらも他の問題を引き起こします。

()クラス名の後にコンストラクターを追加する最初の提案では、これらの行で新しいエラーが発生します。Cannot convert value of type 'OneClass' to expected argument type 'AnyClass' (aka 'AnyObject.Type')

2 番目の提案を使用してパーサー エラーを に変更するOneClass.selfTwoClass.self、パーサー エラーが解消されますが、コードを実行すると永遠に実行されます。エラーが発生したり、完了したりすることはありません。

の代わりにThing.doStuff()期待するパラメーターを変更する必要があることを示唆する推奨事項を他の場所で見つけましたが、それは別の新しい問題のセットを引き起こします。MyClassAnyClass

まず、パーサーが呼び出しについて不平を言い始め、パーサーがcls.init()提案する一連の修正が最終的に意味のないものにつながります: let x = cls.type(of:;; init)(). パーサーは提案ループに入り、ステートメントの途中にセミコロンを追加し続けます。

doStuff()2 番目に、最後の 2 行のへの呼び出しでのタイプの不一致エラーに戻ります: Cannot convert value of type 'OneClass.Type' to expected argument type 'MyClass'.

引数として型を渡すことについて、明らかにここで得られないことがありますが、私が行ったグーグル検索のどれも、私が見ている問題を説明するものに私を着陸させませんでした.

4

2 に答える 2

1

これを機能させるには、に型キャストした後にinitonを呼び出す必要があります。また、クラス タイプにその特定のプロパティが含まれている場合にのみ機能します。これがに型キャストされる理由です。clsNSObject.Typex.nameclsxMyClass

class Thing : NSObject
{
    func doStuff(withClass cls: AnyClass) -> String?
    {
        let x = (cls as? NSObject.Type)?.init()
        if let x = x as? MyClass
        {
            return x.name
        }
        return nil
    }
}

で電話doStuffするClassType.self

print(z.doStuff(withClass: OneClass.self))
print(z.doStuff(withClass: TwoClass.self))

問題が解決しない場合はお知らせください。

于 2018-04-18T17:10:56.760 に答える