2017-08-06 109 views
2

verbDatabase Table 我使用的数据是下方,也可在上面的截图:返回随机属性的实体(核心数据)

+----+------------+------------+------------+ 
| id | infinitive | ind pre je | ind pre tu | 
+----+------------+------------+------------+ 
| 1 | aimer  | aime  | aimes  | 
| 2 | aller  | vais  | vas  | 
| 3 | courir  | cours  | cours  | 
| 4 | servir  | sers  | sers  | 
| 5 | mourir  | meurs  | meurs  | 
| 6 | dormir  | dors  | dors  | 
| 7 | sentir  | sens  | sens  | 
| 8 | vêtir  | vêts  | vêts  | 
| 9 | fuir  | fuis  | fuis  | 
| 10 | tenir  | tiens  | tiens  | 
+----+------------+------------+------------+ 

我是新来的编码和我工作的一名法国共轭通过以不定式形式(对verbLabel.text)和所需的时态(对tenseLabel.text)显示动词来测试用户对它们的结合的应用程序。目标是让用户输入(到userInput.text)该动词的共轭形式并按下按钮(checkAnswer)来检查他们的答案。如果答案是正确的,一个动词,将会产生等

我有一个名为verbDatabase名为idinfinitiveindPreJeindPreTu属性的CoreData实体。

我设法生成一个随机行(显示一个随机动词),但我无法生成随机属性(indPreJe或indPreTu)。要生成一个随机属性,并且由于属性名称必须以小写字母开头,我不能使用与我一样的方法生成随机行。

为了解决这个问题,我尝试创建一个包含属性名称的数组,然后生成一个随机数字,然后将属性名称附加到在tenseLabel.text中显示的获取请求中,但tenseLabel.text显示字符串"verbDatabase[0].indPreJe"的值为verbDatabase[0].indPreJe

有没有什么办法让文本标​​签显示值后附加了随机属性名称而不是字符串指向该值?

如果我以低效的方式处理数据,有没有更好的方法将数据存储到核心数据中,这将使我能够更好地访问我想要做的事情?我仍然试图围绕核心数据结构进行研究。我还考虑将动词作为单独的词典与时态一起保存,作为它们的键和共轭形式作为其相应的值。

我非常希望能够允许用户选择其时态,他们希望能够在和测试也分类动词 - 规则形式,不规则的形式,常用动词等

预先感谢任何帮助!

@IBOutlet weak var verbLabel: UILabel! 
@IBOutlet weak var tenseLabel: UILabel! 
@IBOutlet weak var userInput: UITextField! 
@IBOutlet weak var textView: UITextView! 
var currentRow: Int = 0 
var countTenseColumns: Int = 2 
var currentColumn: Int = 0 
var columnNames = ["id","infinitive","indPreJe","indPreTu"] 

@IBAction func checkAnswer(_ sender: Any) { 

    if userInput.text == verbDatabase[currentRow].indPreTu { 
     textView.text = "correct!" 
     viewWillLayoutSubviews() 
     userInput.text = nil 
    } 

    else { 
    textView.text = "the correct answer is \(verbDatabase[currentRow].indPreTu ?? "error")" 

    } 
} 

func randomNumberGeneratorRow() -> Int { 
    //generates random number from 1 to verbDatabase.count 
    return Int(arc4random_uniform(UInt32(verbDatabase.count)+1)) 
} 

func randomNumberGeneratorColumn() -> Int { 
    //generates random number from 2 to number of columns with tenses 
    return Int(arc4random_uniform(UInt32(countTenseColumns)+2)) 
} 

override func viewWillLayoutSubviews() { 
    currentRow = self.randomNumberGeneratorRow() 
    currentColumn = self.randomNumberGeneratorColumn() 
    var columnName = "verbDatabase[0].\(columnNames[currentColumn])" 

    verbLabel.text = verbDatabase[currentRow].infinitive 
    tenseLabel.text = columnName  
} 

回答

0

有没有什么办法让文字标签已附有随机属性的名称,而不是字符串指向值后显示值?

是的,你可以使用value(forKey:)(见the documentation here):

var columnName = columnNames[currentColumn] 
tenseLabel.text = verbDatabase[currentRow].value(forKey:columnName) 
+0

太谢谢你了!我开始担心我必须重新格式化数据! 为了完整起见,Swift让我加了 'as! String': 'tenseLabel.text = verbDatabase [currentRow] .value(forKey:columnName)as! String' – shortStack