我想获取视图的维度并将其分配给我的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?
答案 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.window
为nil
,则会崩溃,但鉴于在这个特定情况下,我们会在didFinishLaunching
中,如果self.window
某种方式{{1}我们还遇到了一些更大的问题。
然而,Swift的其他选项还有两种方法,你应该使用的三个选项中的哪一种取决于具体情况。
我们可以将第一行更改为更像这样的内容:
nil
它会起作用。如果var screenRect: CGRect = self.window?.bounds ?? CGRectZero
的{{1}}属性为window
,则self
将创建为一个原点为(0,0)并且大小为(0,0)。这将确保nil
始终初始化,永不为零,并且以下所有代码始终执行。
否则,如果我们想让以下代码执行,只要我们能够从screenRect
获取矩形,那么我们可能会尝试更多这样的内容:
screenRect