我正在编写简单的函数,旨在将某些文本框的内容写入类实例中的变量中。
当我尝试打印文本框的内容时,它可以工作。内容在那里。
我尝试将文本框连接到运行该函数的按钮。
以下是一些父类和子类:
class RapName {
var numberProper: String
var nameProper: String
...
init(){
self.numberProper = "number proper"
self.nameProper = "name proper"
...
}
}
class rapNameStyle: RapName {
var twoChainzStyle: (String, String, String)?
var tinyTimTheRapperStyle: (String, String, String, String, String)?
...
var allStyles: [Any]?
override init (){
super.init()
self.twoChainzStyle = (numberProper, " ", noun)
self.tinyTimTheRapperStyle = (adjective, " ", nameProper, " the ", noun)
...
self.allStyles = [twoChainzStyle!, bigSnitchStyle!, crunchyBlackStyle!, tinyTimTheRapperStyle! as Any, zaeTheBlacksmithStyle!,
littleRichardStyle!,drDreStyle!, poetPeteStyle!, notoriousBIGStyle!, flavaFlavStyle!, mrHappyStyle!, captainPotatoStyle!, stevensShakinStyle!] as [Any]
}
}
这是函数:
@IBAction func buttonPress(_ sender: Any) {
rapName.nameProper = textBox1.text!
rapName.numberProper = textBox2.text!
rapName.verb = allVerbs.randomElement()!
rapName.noun = allNouns.randomElement()!
rapName.adjective = allAdjectives.randomElement()!
rapName.secondAdjective = allAdjectives.randomElement()!
rapName.secondNoun = allNouns.randomElement()!
rapName.acronym = textBox4.text!
rapName.titleProper = textBox3.text!
let randomStyle = rapName.allStyles?.randomElement()
let finalString = String("(randomStyle)")
...
rapNameLabel.text = finalString
}
}
目标是显示具有随机样式的说唱名称,其中包含文本框的内容。
但是,仅返回随机说唱名称样式中的原始初始化变量。
因此,例如,如果形容词的文本框包含"little",名称本身的文本框包含"wiggles",并且选择了随机样式littlerichardstyle,则标签应该显示"little wiggles",而不是它只显示"形容词"名称正确"(来自初始化器)。
非常感谢
你应该让 RapNameStyle 中的所有 var 都是计算属性:
class RapNameStyle: RapName {
var twoChainzStyle: (String, String, String)? {
return (numberProper, " ", noun)
}
var tinyTimTheRapperStyle: (String, String, String, String, String)? {
return (adjective, " ", nameProper, " the ", noun)
}
// Same for others
var allStyles: [Any]? {
return [twoChainzStyle!, bigSnitchStyle!, crunchyBlackStyle!, tinyTimTheRapperStyle! as Any, zaeTheBlacksmithStyle!,
littleRichardStyle!,drDreStyle!, poetPeteStyle!, notoriousBIGStyle!, flavaFlavStyle!, mrHappyStyle!, captainPotatoStyle!, stevensShakinStyle!]
}
}
那么 init() 就是 super.init()
考虑下面非常简单的示例:
class ASuper {
var top: Int
init() {
top = 1
}
}
class BSub: ASuper {
var under: Int?
var all: [Any]?
override init() {
super.init()
self.under = 10
self.all = [under!]
}
}
let b = BSub()
b.under = 200
print(b.all!)
你得到 [10] 而不是 [200] 当您将 b.under 的值更改为 200 时,不会重新计算所有值,它仍然是 [10]。它将带有计算的变量。