2014-07-17 51 views
1

我有这么定义的类:斯威夫特可选属性错误

class User { 

    var name : String? 
} 

我使用的代码使用它在我的ViewController:

import UIKit 

class ViewController: UIViewController { 

    let user : User = User() 
} 

我有编译错误

用户()不可构造()

我知道Swift中的属性必须有一个默认值,但是可选项有一个(nil)。如果我将属性“name”初始化为nil或添加init()初始化程序,错误消失。但我不明白为什么我的选项默认情况下不为零。

顺便说一句,在操场下面的代码编译完美:

class ViewController: UIViewController { 

    let user : User = User() 
} 

class User { 

    var name : String? 
} 
let vc = ViewController() 

而且很奇怪。

此问题与this有关,但我不明白那里的答案(为什么可选在操场上有默认值,但在应用程序中没有?)。

编辑:只有在User类定义在一个单独的文件中时,才会发生错误。 Xcode是Beta 3中(见图片)

XCode Versione

User class file

view controller file

+0

是错误的工作不会出现在我的身边。我没有进一步的问题编译这个项目。 – holex

+0

您是否尝试过将该项目作为我编辑中的屏幕截图? – valfer

+0

错误也出现在当前的XCode 6.0 GM(6A313),Swift版本1.0中:-( – valfer

回答

0

您应该提交错误报告 - 这绝对是由编译器不正确的行为。当您尝试初始化您使用的默认初始这样 - Apple's documentation状态:

斯威夫特提供任何结构或基类 ,对于其所有属性提供默认值,并做了默认初始值不是 本身提供至少一个初始化程序。默认初始化程序 只是创建一个新的实例,并将其所有属性设置为默认值 。

那么说明这个例子:

class ShoppingListItem { 
    var name: String? 
    var quantity = 1 
    var purchased = false 
} 
var item = ShoppingListItem() 

然后在下面的段落说:

...(该name属性是一个可选的String属性,所以它 自动接收默认值为nil,即使此代码中未写入 值。)...

+0

谢谢,我的意见还在于它是目前测试版的 – valfer

+0

Github项目的复制问题的bug:https:// github。 com/valfer/OptionalBug – valfer

0

我在iOS应用程序中使用Xcode 6 beta 3试过了你的代码,它只是编译并运行正常。

的代码相同

class User { 
    var name : String? 
} 

class ViewController: UIViewController { 
    let user : User = User() 

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

,如果我设置在这条线断点:

let user : User = User() 

它停止如预期。

您使用的是测试版3吗?你有没有仔细检查你的代码,以确定它实际上是你在这里发布的内容?

+0

是的,我正在使用Beta 3.我认为你的代码按预期工作,因为这两个类都在同一个源文件中,请参阅我的编辑 – valfer

+0

我尝试了github中的代码, t编译唯一的方法是显式地添加一个空的初始化函数*或*初始化变量为'nil'。在我看来,这肯定是一个错误 – Antonio

0

如果你想它来编译你写你的用户类这样的,可能不是很理想,但似乎github.com/valfer/OptionalBug

class User { 

    var name : String? 

    init() { 

    } 
} 
+0

或:class User {var name:String?= nil } – valfer