我是Swift的新手,并且对可选(!,?)没有更多的想法。我试图从plist中获取数据,创建模型并显示到Optional()
。表数据显示完美,但它显示var fileName : String?
var dataArray : Array<SHQuesAns>?
绑定。我试过改变!至 ?但无法解开。你能不能指导我解决这个问题。
这是我的代码&amp;输出 -
fetch
来自pList
-
func loadTableView(){
dataArray = SHDataAccess.init(fname: fileName).arrayFromPlist()
self.questionTableView.dataSource = self
self.questionTableView.delegate=self
self.questionTableView.reloadData()
}
数据
SHDataAccess
import UIKit
var fileName : String!
class SHDataAccess: NSObject {
init(fname:String?) {
super.init()
fileName = fname
}
func arrayFromPlist() -> Array <SHQuesAns>?{
let dataPlists = NSMutableArray(contentsOfFile:NSBundle.mainBundle().pathForResource(fileName, ofType: "plist")!)
var dataObj : Array <SHQuesAns>? = Array()
for data in dataPlists! {
dataObj?.append(SHQuesAns.init(_dic: data as! NSDictionary))
}
return dataObj
}
}
课程 -
UITableView
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return dataArray == nil ? 0 : dataArray!.count
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let aCell = self.questionTableView.dequeueReusableCellWithIdentifier("qcell",forIndexPath: indexPath) as! SHQuestionCell
let q : SHQuesAns = dataArray![indexPath.row]
aCell.lblQuestion.text = "\(q.question)"
return aCell
}
代表 -
$('#modal-form-edit').on('show.bs.modal', function(e) {
var books_id = $(this).data('id');
$('.select2_single option[value="'+books_id+'"]').attr('selected','selected');
});
这是输出 -
答案 0 :(得分:2)
这将删除Optional()文本:
if let q = q.question as? String {
aCell.lblQuestion.text = "\(q.question!)"
} else {
aCell.lblQuestion.text = ""
}
关键是打开问题对象中包含的字符串,以便在将其分配给标签文本时,不会包含Optional()部分。
如果未定义问题字符串,我已添加对nil
案例的支持。
答案 1 :(得分:1)
您可能还考虑不将dataObj
数组作为可选项?它的目的是什么?在我看来,如果你需要向数组添加项目,那么你知道它应该存在,并且因为你已经初始化它,它将始终存在但是可能是空的。相反,只是让它隐式展开,然后如果没有数据则返回nil,那么数组的对象都不会是可选的。
答案 2 :(得分:0)
如果你有一个默认值,你希望可选字符串回退,一个简单的修复就像这样:
"\(q.question ?? "")"
如果q.question为nil
,则默认为空字符串另外:小心你所有的力量打开。有一些警卫陈述或者如果让它解开,可能更有意义。
和swift数组的编写方式如下:var dataArray : [SHQuesAns]?
但是你需要区分一个nil数组和一个空数组的情况并不多,所以你可以只做var dataArray = [SHQuesAns]()
并节省自己打开的需要