为什么要创建一个"Implicitly Unwrapped Optional"来创建一个常规变量或常量?如果您知道它可以成功解开,那么为什么要首先创建一个可选项呢?例如,为什么这样:
let someString: String! = "this is the string"
Run Code Online (Sandbox Code Playgroud)
会比以下更有用:
let someString: String = "this is the string"
Run Code Online (Sandbox Code Playgroud)
如果"optionals指示常量或变量允许'没有值'",但"有时从程序的结构中可以清楚地看到,在首次设置该值之后,可选项将始终具有值",那么有什么意义呢?首先让它成为可选项?如果你知道一个可选项总是会有一个值,那么它不是可选的吗?
Apple的文档指出:
首次初始化属性时,不会调用willSet和didSet观察者.仅在属性的值设置在初始化上下文之外时才调用它们.
是否有可能在初始化期间强制调用它们?
假设我有这门课
class SomeClass {
var someProperty: AnyObject {
didSet {
doStuff()
}
}
init(someProperty: AnyObject) {
self.someProperty = someProperty
doStuff()
}
func doStuff() {
// do stuff now that someProperty is set
}
}
Run Code Online (Sandbox Code Playgroud)
我创建了方法doStuff,使处理调用更简洁,但我宁愿只处理didSet函数中的属性.有没有办法在初始化期间强制调用它?
我决定只为我的类删除便利的intializer并强制你在初始化后设置属性.这让我知道didSet将永远被召唤.我还没有决定这总体上是否更好,但它很适合我的情况.
我试图在我的iOS应用程序中制作一个教程屏幕,用户滑过几张图片以了解该应用程序.一切都很好,除非我构建我的项目,我在第一行代码上得到以下错误:
ViewController类没有初始值设定项
我做错了什么?
我的ViewController.swift代码如下
import UIKit
//line below is where I get the error
class ViewController: UIViewController, UIPageViewControllerDataSource {
//end
var pageViewController: UIPageViewController
var pageTitles: NSArray!
var pageImages: NSArray!
override func viewDidLoad() {
super.viewDidLoad()
self.pageTitles = NSArray(objects: "", "", "")
self.pageImages = NSArray(objects: "page1", "page2", "page3")
self.pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as!
UIPageViewController
self.pageViewController.dataSource = self
var startVC = self.viewControllerAtIndex(0) as ContentViewController
var viewControllers = NSArray(object: startVC)
self.pageViewController.setViewControllers(viewControllers as [AnyObject], direction: .Forward, animated: true, completion: nil)
self.addChildViewController(self.pageViewController)
self.view.addSubview(self.pageViewController.view)
self.pageViewController.didMoveToParentViewController(self)
}
override func …Run Code Online (Sandbox Code Playgroud) 以下代码工作正常
struct carConfi {
var owner: String?
let brand: String = "BMW"
var currentMile: Double = 2000
}
let tomCar = carConfi()
Run Code Online (Sandbox Code Playgroud)
但是,如果我将属性的类型更改owner为常量,则初始化程序将出错
struct carConfi {
let owner: String? // Change to constant
let brand: String = "BMW"
var currentMile: Double = 2000
}
let tomCar = carConfi() //error: missing argument for parameter 'owner' in call
Run Code Online (Sandbox Code Playgroud)
我做了一点搜索,结果是因为可选变量自动具有默认值nil
我猜:因为一旦设置了常量,它就无法更改,如果可选常量自动收到,nil那么它将保持不变nil,非常愚蠢,可能会对用户产生影响
问:我的大学并不完全相信猜测,他告诉我必须有更多理由.如果有人能向我解释,我将非常感激
谢谢
我收到错误:
类 AppDelegate 没有初始值设定项
并且似乎无法理解为什么。我正在关注本教程。我是初学者,因此非常感谢任何帮助!
我的代码:
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
var centerContainer: MMDrawerController
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
_ = self.window!.rootViewController
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let centerViewController = mainStoryboard.instantiateViewController(withIdentifier: "ViewController") as! ViewController
let leftViewController = mainStoryboard.instantiateViewController(withIdentifier: "LeftSideViewController") as! LeftSideViewController
let leftSideNav = UINavigationController(rootViewController: leftViewController)
let centerNav = UINavigationController(rootViewController: centerViewController)
centerContainer = MMDrawerController(center: centerNav, …Run Code Online (Sandbox Code Playgroud)