- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Swift 的新手。我将用 Java 术语解释我想做的事情,希望有人能帮助我理解。
我想要一个在 View Controller 的 viewDidLoad 中实例化/设置的类作用域数组。这听起来很简单,但这是我必须做的才能让它发挥作用。有人可以向我解释为什么 _dictionary 必须实例化为空数组以及为什么我需要使用 as 吗?即使 componentsSeparatedByString 函数返回一个数组,当解包字典时?谢谢。
class ViewController: UIViewController, UITextFieldDelegate
{
var _dictionary : [String] = []
override func viewDidLoad()
{
super.viewDidLoad()
let bundle = NSBundle.mainBundle()
let path = bundle.pathForResource(“TextFile”, ofType: "txt")
var err: NSError?
let dico = NSString(contentsOfFile: path!, encoding: NSUTF8StringEncoding, error: &err)
if let dictionary = dico?.componentsSeparatedByString("\n") as? [String]
{
_dictionary = dictionary
}
else
{
println("Error reading dictionary")
}
}
}
最佳答案
_dictionary
必须指定一个初始值,因为所有 实例属性都必须指定一个初始值。这是一个 Swift 安全功能,可确保所有实例在出生时都格式良好。您可以通过在实际的初始化程序中初始化 _dictionary
来完成此操作,但您没有这样做。您选择在 viewDidLoad
中为其提供第一个“真实”值,这要晚得多。因此,您必须强制自己提供“假”初始值,直到 viewDidLoad
出现并为您提供“真实”初始值。
我不明白你的其他问题,因为我不知道“拆包字典”是什么意思。但也许您指的是这段代码中的其余内容。我会告诉你它。
dico
是一个包装字符串的可选值。它是一个Optional,因为String 的contentsOfFile:
初始化器返回一个Optional - 它是一个失败初始化器。这是因为可能不存在这样的文件,或者该文件可能没有该编码,在这种情况下初始化程序需要返回 nil。
所以现在 dico
是一个可选的包装必须解开的字符串 - 或为零。所以你在下一行中将其解包为 dico?
。假设 dico
不为 nil,此时 dico?
是一个字符串。
然后调用componentsSeparatedByString
。它返回一个 AnyObject
数组。因此,您选择使用 as?
将其转换为 String
数组。我不知道你为什么选择使用 as?
因为你知道如果我们到达这一点,它将是一个 String
数组 - 就我个人而言,我会使用 作为
。但无论如何,as?
总是返回一个Optional!因此,您可以选择使用 if let
条件绑定(bind)来解开那个。
具有讽刺意味的是,_dictionary
不是、也从来不是、也不会是字典 - 它是一个数组。你给这个(和字典
)起的名字选得非常糟糕! dico
是一个字符串,dictionary
和 _dictionary
是数组。看不到字典。
假设我们保留您相当奇怪的名字,您可以更简单、更清楚地完成这一切,如下所示:
var err : NSError?
if let dico = NSString(contentsOfFile: path!,
encoding: NSUTF8StringEncoding, error: nil) {
_dictionary = dico.componentsSeparatedByString("\n") as [String]
} else {
println(err)
}
此外,如果你从 String 类而不是 NSString 类开始,那么 componentsSeparatedByString
将是一个 String 数组,而不是一个无类型的 NSArray(即 AnyObject 数组),你可以跳过 Actor 阵容:
var err : NSError?
if let dico = String(contentsOfFile: path!,
encoding: NSUTF8StringEncoding, error: nil) {
_dictionary = dico.componentsSeparatedByString("\n")
} else {
println(err)
}
关于ios - Swift 可选值及其实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27726578/
我正在尝试用 Swift 编写这段 JavaScript 代码:k_combinations 到目前为止,我在 Swift 中有这个: import Foundation import Cocoa e
我是一名优秀的程序员,十分优秀!