19

Swift にカスタム クラスがあり、添字を使用してそのプロパティにアクセスしたいのですが、可能ですか?

私が欲しいのは次のようなものです:

class User {
    var name: String
    var title: String

    subscript(key: String) -> String {
        // Something here
        return // Return the property that matches the key…
    }

    init(name: String, title: String) {
        self.name = name
        self.title = title
    }
}

myUser = User(name: "Bob", title: "Superboss")
myUser["name"] // "Bob"

更新:これを探している理由は、GRMustacheを使用して HTML テンプレートからレンダリングしているためです。モデル オブジェクトを GRMustache レンダラーに渡すだけにしたいのですが…</p>

GRMustache は、キー付き添字 objectForKeyedSubscript: メソッドとキー値コーディング valueForKey: メソッドを使用して値をフェッチします。準拠オブジェクトは、テンプレートに値を提供できます。

https://github.com/groue/GRMustache/blob/master/Guides/view_model.md#viewmodel-objects

4

6 に答える 6

10

valueForKey を使用すると、名前を使用してプロパティにアクセスできるようになります。NSObject を継承するオブジェクトで作業していることを確認してください

class people: NSObject {
    var age: NSString = "44"
    var height: NSString = "153"
}

let person:people = people()

let stringVariable = "age"

person.valueForKey("age")
// Print "44"

person.valueForKey("\(stringVariable)")
// Print "44"
于 2015-01-30T21:51:08.530 に答える
5

(GRMustacheの作者はこちら)

高速指向の Mustache ライブラリが登場するまでは、クラスを NSObject から継承することをお勧めします (valueForKey:メソッドを持つようにします)。GRMustache は、このメソッドで値を取得します。

それでもうまくいかない場合 (レンダリングで空白の値)、GRMustache のセキュリティ機能を無効にしてみてください ( https://github.com/groue/GRMustache/blob/master/Guides/security.md#disabling-safeを参照)。 -キーアクセス)

他の問題が発生した場合は、リポジトリで問題を開いてください: https://github.com/groue/GRMustache/issues

編集 2015 年 2 月 2 日: GRMustache.swift が出ました: http://github.com/groue/GRMustache.swift

于 2014-06-12T05:54:54.473 に答える
4

上記の Shim の回答は、Swift 4 では機能しなくなりました。注意すべき点が 2 つあります。

まず、value(forKey:)関数を使用する場合、クラスは継承する必要がありますNSObject

次に、Objective-C は値の型について何も知らないため@objc、値の型のプロパティの前にキーワードを配置する必要があり、Swift が面倒な作業を行います。

次に例を示します。

import Foundation

class Person: NSObject {
    @objc var name: String = "John Dow"
    @objc var age: Int = 25
    @objc var height: Int = 180

    subscript(key: String) -> Any? {
        return self.value(forKey: key)
    }
}

let person: Person = Person()

person["name"] // "John Dow"
person["age"] // 25
person["height"] // 180
于 2017-10-19T13:14:40.177 に答える
2

私はあなたができると思います:

class User {
    let properties = Dictionary<String,String>()

    subscript(key: String) -> String? {
        return properties[key]
    }

    init(name: String, title: String) {
        properties["name"] = name
        properties["title"] = title
    }
}

ユースケースを知らなければ、これを行うことを強くお勧めします。

別のアプローチ:

class User {
    var name : String
    var title : String

    subscript(key: String) -> String? {
        switch key {
            case "name" : return name
            case "title" : return title
            default : return nil
        }
    }

    init(name: String, title: String) {
        self.name = name
        self.title = title
    }
}

Swift は現在、名前によるリフレクションをサポートしていないように見えることに注意してください。このreflect関数は、Mirror添え字がIntベースではなく、ベースである a を返しますString

于 2014-06-10T10:41:23.367 に答える