如何将可选字符串转换为字符串

8
@IBOutlet var navBar: UINavigationBar!
@IBOutlet var menuButton: UIBarButtonItem!
@IBOutlet var topicNameLabel: UILabel!
var topicName:String!
override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.
    menuButton.target = self.revealViewController()
    menuButton.action = Selector("revealToggle:")

    navBar.barTintColor = UIColor(red: 0, green: 0.4176, blue: 0.4608, alpha: 1)
    topicNameLabel.text = self.topicName

}

这是我的代码,我将通过prepareForSegue传递一个字符串到topicName,然而在模拟器中,我的topicNameLabel显示为“Optional(我想要的文本)”。我只想要“我想要的文本”,但不需要Optional。有人能帮我吗?


1
你可以使用空合并运算符:topicNameLabel.text = self.topicName ?? ""。如果你的可选变量 topicNamenil,则会显示默认的空文本 "",否则,它将被解包并赋值给标签文本。此外,你可能想将你的 String 变量声明为 var topicName: String?,而不是 String! - dfrib
topicName 属性的值在哪里设置? - Darren
如果您以这种方式声明它,它将始终是可选的,但不用担心,除非您忘记初始化它,否则它的行为不会改变。如果您传递或打印它,它将正常工作。但是,如果这对您来说很重要,您可以给它一个默认值 "" - EBDOKUM
考虑将 topicName 声明为非可选的空字符串。标签上的“缺失”值无论如何都是一个空字符串。 - vadian
我尝试使用 "topicNameLabel.text = self.topicName!" 和 "var topicName:String?",但仍然不起作用。 :-( - Hanslen Chen
3个回答

8

可选字符串表示该字符串可能为空。来自Swift编程语言中的"The Basics"

Swift还引入了可选类型,处理缺少值的情况。

当您在控制台上打印可选字符串时,它会告诉您它是一个可选项。因此,字符串的值不包含“Optional”关键字...

例如

var str : String?
str = "Hello" // This will print "Optional("Hello")"
print(str)
print(str!) // This will print("Hello") 

但是 str 值为 "Hello"。它是一个可选的字符串。

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Hanslen Chen
OP定义了topicName作为一个隐式解包的String,这是声明var topicName:String!,并且他只是简单地使用topicName。 这与声明为String?然后执行强制解包的结果相同,就像你正在做的那样。 - Luca Angeletti

4

问题不在这里

您的属性被声明为一个隐式解包可选字符串

var topicName: String!

因此,当您使用它时,值会自动解包。

示例:

var topicName:String!
topicName = "Life is good"
print(topicName)

输出

生活很美好

正如您所看到的,输出中没有 Optional(Life is good)。因此这段代码是正确的。

我的理论

我猜测您正在使用一个包含Optional(...)单词的String来填充topicName

这就是为什么您的输出中会有Optional(...)的原因。

测试我的理论

为了测试这种情况,让我们向属性添加一个观察者

willSet(newValue) {
    print("topicaName will be set with this: \(newValue)")
}

我期望您在日志中看到类似以下的内容。
topicaName will be set with this: Optional(Hello)

找到真正的问题(即谁在编写字符串“Optional(“Hello”)”?)

如果确实发生了这种情况,只需在观察器中设置断点,并查找在您的项目中编写字符串Optional("Hello")的指令。


我尝试了,但是有些奇怪,print("StackOverflow 告诉我这个 (topicName)")。然而,它打印出了 StackOverflow 告诉我这个 Optional("Optional(My baby don't eat food)")。 - Hanslen Chen
@HanslenChen: 你创建了属性观察器吗? - Luca Angeletti
在prepareForSegue中,我有以下代码: var topic:String topic = String(sender) topicVC.topicName = topic as String! - Hanslen Chen
@HanslenChen:那可能就是问题所在了。sender的类型是什么? - Luca Angeletti
输出为 sender.dynamicType: Optional<AnyObject>。 - Hanslen Chen
显示剩余4条评论

3

我认为你的问题在于字符串中真正包含了一个"可选项",你可以尝试使用indexAt(0)来查看是否是"o"。


非常感谢。这是我的情况。再次感谢。 - Abdul Yasin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接