- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试压缩我正在处理的应用程序,该应用程序涉及一个包含大量 UIViewControllers
和 UITableViews
的大目录。
我的计划是重写将使用一次性可重用 UIViewController
和 UITableView
的应用程序,它将在运行时/之后根据需要从 txt 文件加载数据。 txt 文件将在运行时/运行后读取,而不必事先构建所有 swift 文件。
目前,每次我对项目进行更改时,我的应用程序都需要几分钟的时间来构建/编译。因此,我希望通过根据需要读取和解析 txt 文件,我将能够在短短几秒钟内构建应用程序。
下面是我尝试使用下面提供的示例文本文件 (candyTextFile.txt
) 来读取和生成必要的“糖果”数组。 请查看类 MasterViewController
中的注释行,了解错误消息和我尝试将糖果数组输出为的代码。
请注意,我已将文本文件中的行缩短为三行。我的最终应用程序将包含许多类似的文本文件,每个文件都扩展了数百行。
我对 Swift 还是比较陌生,所以如果我遗漏了一些简单的东西以及我使用/不使用适当的术语,我深表歉意。
我相信术语 CandySearch
只是来自项目名称(参见 here)。我不确定为什么它会在 candies
数组中输出。此外,我现在确实看到我当前的 myArray
是作为一个类建立的。我怎样才能把它变成一个数组?
这是我的MasterViewController.swift
中的相关代码,
class MasterViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var candies = [myArray]()
var evenIndicies = [String]()
var oddIndicies = [String]()
override func viewDidLoad() {
super.viewDidLoad()
setUpArray()
}
private func setUpArray() {
if let filepath = Bundle.main.path(forResource: "candyTextFile", ofType: "txt") {
do {
// let contents = try String(contentsOfFile: "candyTextFile", encoding: String.Encoding.utf8)
let contents = try String(contentsOfFile: filepath)
let lines_separatedBy_n : [String] = contents.components(separatedBy: "\n")
let string = lines_separatedBy_n.map { String($0) }.joined(separator: ", ")
print("string: \(string)")
let lines_separatedBy_comma : [String] = string.components(separatedBy: ", ")
print("lines_separatedBy_comma: \(lines_separatedBy_comma)")
for (index, element) in lines_separatedBy_comma.enumerated() {
if index % 2 == 0 {
evenIndicies.append(element)
print("evenIndicies: \(evenIndicies)")
} else {
oddIndicies.append(element)
print("oddIndicies: \(oddIndicies)")
}
}
evenIndicies.remove(at: evenIndicies.count - 1) // the -1 removes the nil element, "", in the array. For some reason, there is a fourth element, "", in the evenIndicies array. Therefore, I remove it by subtracting one index so I get the three indexes. My in project txt file is four lines long where the fourth line is empty. I think this is why it is showing up "" for the fourth index.
print("evenIndicies outside for-loop: \(evenIndicies)")
print("oddIndicies outside for-loop: \(oddIndicies)")
candies = [myArray(category: evenIndicies, name: oddIndicies)] //
print("candies: \(candies)")
// This prints as the following:
// candies: [CandySearch.myArray]
// HOWEVER, I am trying to get it to print as:
// [CandySearch.myArray(category: "Chocolate", name: "Chocolate Bar"), CandySearch.myArray(category: "Chocolate", name: "Chocolate Cookie"), CandySearch.myArray(category: "Hard", name: "Lollipop")]
} catch let error as NSError {
print(error.localizedDescription)
}
}
}
}
class myArray {
let category: [String]
let name: [String]
init(category: [String], name: [String]) {
self.category = category
self.name = name
}
}
在我的文本文件 candyTextFile.txt
中,我有
Chocolate, Chocolate Bar
Chocolate, Chocolate Cookie
Hard, Lollipop
最佳答案
假设您想要做的是从文本文件中获取信息并最终得到一系列糖果产品,我将尝试一下。目前,您的 myArray
类看起来有点像弗兰肯斯坦的东西。它在该类的单个实例内的两个单独数组中包含所有类别和名称。然后将其放入名为 candies
的数组中。除非我误解了您的要求,否则这一切看起来都是死胡同。 (也许我是。)但假设我至少对了一半......
你想要一组糖果,所以让我们创建一个新类来存放单个糖果。
class Candy {
let category: String!
let name: String!
init(category: String, name: String) {
self.category = category
self.name = name
}
}
这与您已有的类似,但是当您实例化 Candy
的实例时,它将保存单个糖果的详细信息。注意类名按照惯例以大写字母开头。
你想以糖果数组结束,所以让我们改变你的 candies
数组的定义。
var candies: [Candy] = []
剩下的就是更改您的 for in
循环以在每个循环中提取一个糖果的数据(类别和名称),创建一个新的 Candy
实例并填充它在将其添加到 candies
之前。
for (index, element) in lines_separatedBy_comma.enumerated() {
var newCategory = ""
var newName = ""
if index % 2 == 0 {
newCategory = element
} else {
newName = element
}
let newCandy = Candy(category: newCategory, name: newName)
candies.append(newCandy)
}
您的代码中没有任何检查来处理文本文件中的任何错误/错误格式,所以我假设您绝对确定它是由成对的数据组成的,没有松散的末端等。我看到你出于某种原因删除了 evenIndices
的最后一个元素。我不确定为什么,所以我没有处理过。
现在您的 candies
数组应该包含一堆 Candy
对象,因此要将它们列出到控制台,您可以这样做。
for candy in candies {
print("category: \(String(describing: candy.category)), name: \(String(describing: candy.name))")
}
让我知道我是否仍未达到目标。
编辑 ************************************************* ********** 编辑
我看了你链接的 RW 教程。
本教程为 Candy
元素使用了一个 struct
,而您(和我)使用的是一个类。我猜你还在学习 Swift 的值和引用类型,所以不要把这里的水弄混了。可以说 struct
在这种情况下可能会更好。 print
也以不同的方式处理它们,并且似乎能够在结构内部查找值,而除非您明确提取属性(如我的 for in
print 语句,它只会给您我们所见的类列表。
我还整理了逻辑(它很丑陋,你不应该这样做)所以你至少可以看到它确实有效(在某种程度上)。整个 setupArray
方法:
private func setupArray() {
if let filepath = Bundle.main.path(forResource: "candyTextFile", ofType: "txt") {
do {
let contents = try String(contentsOfFile: filepath)
let lines_separatedBy_n : [String] = contents.components(separatedBy: "\n")
let string = lines_separatedBy_n.map { String($0) }.joined(separator: ", ")
var lines_separatedBy_comma : [String] = string.components(separatedBy: ", ")
// I've put this in to remove the last bit of the file that was causing the count to be one too high.
// I'm guessing that's why you had something similar previously?
lines_separatedBy_comma.removeLast()
for (index, element) in lines_separatedBy_comma.enumerated() {
if index % 2 == 0 {
let newCategory = element
let newName = lines_separatedBy_comma[index + 1]
let newCandy = Candy(category: newCategory, name: newName)
candies.append(newCandy)
}
}
for candy in candies {
print("category: \(candy.category!), name: \(candy.name!)")
}
print("\ncandies: \(candies)")
} catch let error as NSError {
print(error.localizedDescription)
}
}
}
当我使用时:
class Candy {
let category: String!
let name: String!
init(category: String, name: String) {
self.category = category
self.name = name
}
}
输出是:
category: Chocolate, name: Chocolate Bar
category: Chocolate, name: Chocolate Cookie
category: Hard, name: Lollipop
candies: [FileTest.Candy, FileTest.Candy, FileTest.Candy]
当我使用时:(从 print 语句中移除强制展开后)
struct Candy {
let category : String
let name : String
}
输出是:
category: Chocolate, name: Chocolate Bar
category: Chocolate, name: Chocolate Cookie
category: Hard, name: Lollipop
candies: [FileTest.Candy(category: "Chocolate", name: "Chocolate Bar"), FileTest.Candy(category: "Chocolate", name: "Chocolate Cookie"), FileTest.Candy(category: "Hard", name: "Lollipop")]
你能看到你的原始代码将所有内容都放在一个 myArray
中,但是上面的代码(和 RW 站点上的代码)创建了单独的 Candy
元素并将它们全部存储到糖果
?这是方法上的根本区别。
关于swift - 无法将文本文件读入所需的数组格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54016169/
我有一个依赖于包 B 的包 A。当包 A 中的代码运行并访问包 B 中的类时,包 B 的状态将被解析 (4),而不是 Activity (32) 和包 B 的激活器也没跑好。我认为 bundle B
这个问题在这里已经有了答案: How to remove the space between inline/inline-block elements? (41 个回答) 关闭 7 年前。
我正在尝试使用 Java OpenAL 库。我在导入名为 libsoft_oal.so 的 native 库时遇到问题。 Java OpenAL 依赖于 OpenAL 软实现。我尝试根据他们在 git
我正在尝试启动我的应用程序。是一个 unicorn +工头+sinatra的应用。 这是我的 config.ru 文件: require "rubygems" require "sinatra" Bu
我有一个下拉列表,其中包含一些从数据库表中检索的值,我想要的是当单击按钮时它应该只获得选项标签的中间值,但只有那些类名为“get_this”的选项标签并离开那些选项,如果他们没有这个类 预期输出:值
我有一个index.php文件,需要一个通用的head.php文件,head.php文件中有几个Javascript文件,当这样尝试时,代码在源代码中看起来很好,但文件却不是实际上对文档做任何事情。
有人能帮帮我吗? 我已经像这样运行了 imsmod: $ insmod /data/mm/mmdev.ko epoll_rate=100 但是我得到一个错误: insmod: init_module
是否有键盘快捷键或插件可以在 Notepad++ 中打开 PHP 所需或包含的文件?我知道,在 Dreamweaver 中,执行此操作的命令是 Ctrl+D,但我似乎无法在 Notepad++ 中找到
我已经用 js 设置了一个显示/隐藏 div,但我很难弄清楚如何一次显示一个 div。目前发生的情况是,除非我再次单击原始链接来关闭该 div,否则每个 div 都会显示。 http://www.li
当我尝试将未分配的辅助分片分配给节点时出现错误。 { "error": { "root_cause": [ { "type": "remote_transpor
我正在构建一个 C++ 应用程序,使用 Netbeans 6.9 作为我的 IDE。我有一个 C++ 库,它是一个纯 C 库的包装器。 我已将文件正确添加到项目中(使用添加库文件选项)。这是 g++
我是一名优秀的程序员,十分优秀!