Swift-structure中的非可选值返回可选值

时间:2017-09-06 13:14:13

标签: swift struct optional

我在一个ViewController中有一个结构,它有几个非可选成员,如:

struct MyStruct {
    let id: Int64!
    let name: String!
    func checkValues() -> Bool {
        if id == nil || name == nil {
            return false
        } else {
            print("id: \(id) name: \(name)"); return true
        }
    }
}

我在另一个VC(let temp = ViewController.MyStruct(id: 10, name: "Example"))中创建了一个struct实例,并将其传递给我通过Segue创建结构的那个。执行temp.checkValues()时,我得到了

id: Optional(10) name: Optional("Example")

根据我对(非)选项的理解,我不应该得到Optional(),因为我用!声明了变量。我弄错了吗?现在我只要在使用它时就加上一个感叹号。我也尝试在结构中使用init,但这并没有改变任何东西。 因为这不是预期的(如果我是对的)我担心我没有得到完整的概念......请告诉我我的代码/我有什么问题。

2 个答案:

答案 0 :(得分:7)

  

我弄错了吗?

是。您的变量选项 - !运算符是强制解包运算符,因此您的变量隐式展开。如果您不希望自己的变量成为选项,只需删除!

Swift中存在!运算符,以便于从Objective-C进行桥接,例如IBOutlet变量。除此之外使用!运算符是一种不好的做法。

答案 1 :(得分:5)

!是一个隐含无法解开的可选。以! 结尾的所有变量声明类型都是可选的。你不必将它们声明为Optional。只需正常使用它们,初始化程序就会照顾它们:

struct MyStruct {
    let id: Int64
    let name: String
    func checkValues() -> Bool {
        print("id: \(id) name: \(name)"); return true
    }
}