Swift选项可选值

时间:2014-11-08 17:20:02

标签: ios swift optional

我想获取视图的维度并将其分配给我的scrollView。这是我的代码:

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
    // Override point for customization after application launch.

    var screenRect:CGRect = self.window?.bounds

    var bigRect = screenRect
    bigRect.size.width *= 2.0
    bigRect.size.height *= 2.0

    var scrollView:UIScrollView = UIScrollView(frame: screenRect)
    self.window?.addSubview(scrollView)

    var hypnoView:View = View(frame: bigRect)
    scrollView.addSubview(hypnoView)

    scrollView.contentSize = bigRect.size

    self.window?.backgroundColor = UIColor.whiteColor()


    return true
}

当我写这个xcode var screenRect:CGRect = self.window?.bounds Xcode给我一个错误的OptionalValue ....我迷失了与theese的选项。 如何翻译旧的Objective-c行

CGRect screenRect = self.window.bounds 

进入swift?

2 个答案:

答案 0 :(得分:4)

var screenRect = self.window!.bounds会对你有用。

请注意,如果self.window为零,您的应用将在此行崩溃,因为这是!运营商所做的事情:展开可选内容,崩溃如果{ {1}}。

在这种情况下,变量的类型为nil,意味着它可以有UIWindow?,或者可能是UIWindow。如果要访问nil对象,则需要打开它。在这个特殊情况下,我建议UIWindow出于特定原因。继续阅读:

是的,!如果!self.window,则会导致代码崩溃。那么为什么要用这个?通过执行此操作,您将断言您希望nil已设置,self.window是错误情况,并且希望您的应用程序大声崩溃并且明显地。您将看到崩溃,并查看代码中的其他位置以修复实际错误。也许您没有在Interface Builder中为窗口连接nil,或者其他东西。

参考原帖,说IBOutlet的问题是这样的:当你写这个时,你会说“尝试展开self.window?.bounds - 如果它是零,没什么大不了的,只需返回window而不是尝试获取nil。但bounds的类型是screenRect(没有问号),这意味着它不能 CGRect。所以,你的代码没有编译。

如果您真的希望nil可能为零,则需要将screenRect声明为screenRect,这意味着它可能有CGRect?,或者可能是CGRect

最后,请阅读本文以更好地理解选项:https://mikeash.com/pyblog/friday-qa-2014-06-20-interesting-swift-features.html

答案 1 :(得分:2)

在这个具体案例中最好的选择可能是,正如DPlusV在答案的第一行所示:

var screenRect: CGRect = self.window!.bounds

如果self.windownil,则会崩溃,但鉴于在这个特定情况下,我们会在didFinishLaunching中,如果self.window某种方式{{1}我们还遇到了一些更大的问题。

然而,Swift的其他选项还有两种方法,你应该使用的三个选项中的哪一种取决于具体情况。


我们可以将第一行更改为更像这样的内容:

nil

它会起作用。如果var screenRect: CGRect = self.window?.bounds ?? CGRectZero 的{​​{1}}属性为window,则self将创建为一个原点为(0,0)并且大小为(0,0)。这将确保nil始终初始化,永不为零,并且以下所有代码始终执行。


否则,如果我们想让以下代码执行,只要我们能够从screenRect获取矩形,那么我们可能会尝试更多这样的内容:

screenRect