在Swift中创建对象数组的正确语法是什么?

时间:2016-02-28 15:21:51

标签: arrays swift object

我创建了两个单独的文件[Page.swiftPageTableViewController.swift]

在Page.swift中:

    class Page {

        // MARK: Properties
        var chapter: Int
        var verse: Int
        var sanskrit: String?

        // MARK: Initialization
        init?(chapter: Int, verse: Int, sanskrit: String?)    {
            // Initialize stored properties.
            self.chapter      = chapter
            self.verse        = verse
            self.sanskrit     = sanskrit
        }


    }

在我的PageTableViewController.swift中:

import UIKit

class PageTableViewController: UITableViewController {

    // MARK: Properties
    var pages = [Page]()


    override func viewDidLoad() {
        super.viewDidLoad()
        createPages()
    }

    func createPages() {

        let page1 = Page(chapter: 1, verse: 1, sanskrit: "अथ योगानुशासनम्")
        let page2 = Page(chapter: 1, verse: 2, sanskrit: "योगश्चित्तवृत्तिनिरोधः")

        pages += [page1, page2] // ERROR appears here as noted below..


    }

}

但是error出现的地方,我得到了:

Binary operator '+=' cannot be applied to operands of type '[Page]' and '[Page?]'

为什么会这样?

2 个答案:

答案 0 :(得分:2)

答案盯着你的眼睛:

Binary operator '+=' cannot be applied to operands of type '[Page]' and '[Page?]'

[page1,page2]是一个可选的Page数组。您不能将可选页面数组添加到Page数组中。

为什么[page1,page2]是一个可选的Page?因为page1和page2是可选的Page。

为什么page1是可选页面?因为您的init方法返回一个可选的Page。它被称为init?而不是init。

为什么你的init方法返回一个可选的Page?因为这就是你的代码所说的。我看不出你为什么这么做的原因,但这就是你所做的。

(现在,在修复init方法返回非可选页面后,可能还有其他原因导致其失败)。

答案 1 :(得分:-2)

在Swift中,没有+ =操作数用于与数组值交互(对于添加到现有数组,您将使用append)。我将您的代码加载到Playground中,通过将= =替换为=符号来找到数组。但是,因为您的页面初始化是可选的,所以我必须打开第1页和第2页:

public class BlogComment
{
    public int Id { set; get; }

    [MaxLength]
    public string Body { set; get; }

    public virtual BlogComment Reply { set; get; }
    public int? ReplyId { get; set; }
    public ICollection<BlogComment> Children { get; set; }
}    



using (var ctx = new MyContext())
            {
                var list = ctx.BlogComments
                          //.where ...
                          .ToList() // fills the childs list too
                          .Where(x => x.Reply == null) // for TreeViewHelper                        
                          .ToList();
            }

另一种可能的解决方案,因此您不需要始终打开这些值或使用感叹号来强行打开它们,只需删除?来自Page对象的init。