свойство объекта доступа в виде строки в swift 4? [Дубликат]

получить все данные из одного поля с помощью _id

db.student.find({}, {roll:1})

SELECT roll FROM student

получить все данные из одного поля без _id

db.student.find({}, {roll:1, _id:0})

найти определенные данные, используя предложение where

db.student.find({roll: 80})

SELECT * FROM students WHERE roll = '80'

найти данные используя условие where и больше, чем условие

db.student.find({ "roll": { $gt: 70 }})

SELECT * FROM student WHERE roll> '70'

найти данные, используя предложение where и меньше или равно условию

db.student.find({ "roll": { $lte: 70 }})

SELECT * FROM student WHERE roll & lt; = '70'

найти данные, используя where where и меньше, чем до условие

db.student.find({ "roll": { $lt: 70 }})

SELECT * FROM student WHERE roll & lt; '70'

12
задан Matias Korhonen 10 June 2014 в 11:54
поделиться

6 ответов

(здесь автор GRMustache)

До тех пор, пока не будет выведена из строя ориентированная на усталость библиотека Усы, я предлагаю, чтобы ваши классы наследовали от NSObject (так, чтобы они имели метод valueForKey:). Затем GRMustache извлекает значения с помощью этого метода.

Если это все равно не будет работать (пустые значения в рендеринге), вы можете попытаться отключить функции безопасности GRMustache (см. https: // github. com / groue / GRMustache / blob / master / Guides / security.md # disabling-safe-key-access )

Если у вас возникли другие проблемы, пожалуйста, откройте проблему прямо в репозитории : https://github.com/groue/GRMustache/issues

РЕДАКТИРОВАТЬ 2 февраля 2015 г.: GRMustache.swift отсутствует: http://github.com /groue/GRMustache.swift

4
ответ дан Gwendal Roué 3 September 2018 в 16:29
поделиться

Это немного взломать, используя отражение. Может быть использовано следующее:

protocol PropertyReflectable { }

extension PropertyReflectable {
    subscript(key: String) -> Any? {
        let m = Mirror(reflecting: self)
        for child in m.children {
            if child.label == key { return child.value }
        }
        return nil
    }
}

struct Person {
    let name: String
    let age: Int
}

extension Person : PropertyReflectable {}

Затем создайте Person и получите доступ к его ключевым свойствам.

let p = Person(name: "John Doe", age: 18)

p["name"] // gives "John Doe"
p["age"] // gives 18

Вы можете всегда изменить индекс возвращает интерполированную строку значения свойства.

6
ответ дан Benzi 3 September 2018 в 16:29
поделиться

Ответ Shim выше не работает в Swift 4. Есть две вещи, о которых вы должны знать.

Прежде всего, если вы хотите использовать функцию 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
2
ответ дан Frank Wang 3 September 2018 в 16:29
поделиться

Я полагаю, вы могли бы сделать:

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, а не String.

2
ответ дан hpique 3 September 2018 в 16:29
поделиться

Добавление некоторого синтаксического сахара в ответ Бензи:

protocol PropertyReflectable { }

extension PropertyReflectable {
    subscript(key: String) -> Any? {
        let m = Mirror(reflecting: self)
        return m.children.first { $0.label == key }?.value
    }
}

struct Person {
    let name: String
    let age: Int
}

extension Person : PropertyReflectable {}

Затем создайте Person и получите доступ к его свойствам.

let p = Person(name: "John Doe", age: 18)

p["name"] // gives "John Doe"
p["age"] // gives 18
0
ответ дан Justin Oroz 3 September 2018 в 16:29
поделиться

Использование 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"
6
ответ дан shim 3 September 2018 в 16:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: