相关疑难解决方法(0)

为什么要创建"Implicitly Unwrapped Optionals",因为这意味着你知道它有价值?

为什么要创建一个"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指示常量或变量允许'没有值'",但"有时从程序的结构中可以清楚地看到,在首次设置该值之后,可选项将始终具有值",那么有什么意义呢?首先让它成为可选项?如果你知道一个可选项总是会有一个值,那么它不是可选的吗?

design-patterns optional swift

481
推荐指数
6
解决办法
6万
查看次数

是否可以在Swift初始化期间允许调用didSet?

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 swift didset

199
推荐指数
4
解决办法
4万
查看次数

无法弄清楚为什么我在Swift iOS应用程序代码中获得"Class ViewController没有初始化程序"错误

我试图在我的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)

iphone xcode ios swift xcode6

16
推荐指数
2
解决办法
1万
查看次数

为什么可选常量不会自动具有默认值nil

以下代码工作正常

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,非常愚蠢,可能会对用户产生影响

问:我的大学并不完全相信猜测,他告诉我必须有更多理由.如果有人能向我解释,我将非常感激

谢谢

optional swift

6
推荐指数
1
解决办法
422
查看次数

如何解决错误“类 appDelegate 没有初始值设定项”?

我收到错误:

类 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)

init uikit ios appdelegate swift

2
推荐指数
1
解决办法
2945
查看次数

标签 统计

swift ×5

ios ×3

optional ×2

appdelegate ×1

design-patterns ×1

didset ×1

init ×1

iphone ×1

uikit ×1

xcode ×1

xcode6 ×1