swift 数组不包含实例变量

Posted

技术标签:

【中文标题】swift 数组不包含实例变量【英文标题】:swift array won't contain instance variables 【发布时间】:2014-07-28 15:31:44 【问题描述】:
import UIKit

class KeyboardViewController: UIInputViewController, UIImagePickerControllerDelegate,     UINavigationControllerDelegate 

@IBOutlet var nextKeyboardButton: UIBarButtonItem
var statusLabel: UILabel  = UILabel()
var bottomBar : UIToolbar = UIToolbar()


var globeIcon : UIImage = UIImage(named: "globe-hover.png")
@IBOutlet var captureButton : UIBarButtonItem
@IBOutlet var libraryButton : UIBarButtonItem


override func viewDidLoad() 

    super.viewDidLoad()

    self.statusLabel.text="viewDidLoad() called"
    // Perform custom UI setup here
    self.nextKeyboardButton = UIBarButtonItem(image: self.globeIcon, style: .Plain , target: self, action: "advanceToNextInputMode")
    self.captureButton = UIBarButtonItem(title: "Take Photo", style: .Plain, target: self, action: "captureClicked")
    self.libraryButton = UIBarButtonItem(title: "Library", style: .Plain, target: self, action: "libraryClicked")

    self.statusLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
    self.statusLabel.sizeToFit()



   var barItems : [UIBarButtonItem] = [self.nextKeyboardButton, self.captureButton, self.libraryButton]

    self.bottomBar.items = barItems
    self.view.addSubview(self.bottomBar)
    self.view.addSubview(self.statusLabel)



    var statusLabelLeftSideConstraint = NSLayoutConstraint(item: self.statusLabel, attribute: .Right, relatedBy: .Equal, toItem: self.view, attribute: .Right, multiplier: 1.0, constant: 0.0)
    var statusLabelBottomConstraint = NSLayoutConstraint(item: self.statusLabel, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Top, multiplier: 1.0, constant: 0.0)
    self.view.addConstraints([statusLabelLeftSideConstraint, statusLabelBottomConstraint])






每次运行此程序时,我都会收到运行时错误:“致命错误:在展开可选值时意外发现 nil”,指的是位 var barItems : [UIBarButtonItem] = [self.nextKeyboardButton, self.captureButton, self.libraryButton],并且调试器指出 barItems 是一个空数组 (nil)。

这里发生了什么?为什么数组 barItems 不包含我的实例 UIBarButtonItem 变量?似乎 UIBarButtonItem 类型变量(captureButton、libraryButton 和 nextKeyboardButton)本身是 nil,但为什么呢?提前致谢!

【问题讨论】:

要让 barItems 数组接受 nil 值,请将类型更改为 [UIBarButtonItem?]。然后,您需要在使用 if let concreteItem = barItems[n] . code when not nil . else . code when nil . 构造之前显式检查每个数组项以查看它是否为 nil。 提示:在 viewWillAppear 中创建数组。 【参考方案1】:

由于目标 C 指针不具有 swift 提供的相同类型安全性这一事实,许多来自目标 C 的对象都是隐式展开的可选项。

您在这一行收到错误,因为类型 [UIBarButtonItem] 不允许数组中包含 nil 值,并且您放入数组中的某些值是 nil。 p>

var barItems : [UIBarButtonItem] = [self.nextKeyboardButton, self.captureButton, self.libraryButton]

为了使调试更简单,我要做的第一件事是向这些值的原始实例添加类型(您希望是nil):

self.nextKeyboardButton : UIBarButtonItem = UIBarButtonItem(image: self.globeIcon, style: .Plain , target: self, action: "advanceToNextInputMode")
self.captureButton : UIBarButtonItem = UIBarButtonItem(title: "Take Photo", style: .Plain, target: self, action: "captureClicked")
self.libraryButton : UIBarButtonItem = UIBarButtonItem(title: "Library", style: .Plain, target: self, action: "libraryClicked")

objective-c 中的一些初始化器返回 nil 表示初始化失败,也许这里就是这种情况?如果是,则添加类型注释后会出现不同的错误。你能发布那个错误吗?

【讨论】:

在做一些测试之后,项目的初始化程序肯定会返回 nil 导致所有问题。在 viewDidLoad() 方法之前实例化它们之后,我得到了第二个和第三个 UIBarButtonItems 的错误 'viewController.Type' does not have a member named 'globeIcon'Missing argument for parameter 'landscapeImagePhone' in call。检查文档后,我不应该提供那个论点,所以我不明白那里有什么问题。我也不明白globeIcon 的问题。有什么见解吗? 当我错误地将 [UIBarButtonItem] 分配给 navigationItem.rightBarButtonItem(而不是 rightBarButtonItems)时,我得到了“在调用中缺少参数 'landscapeImagePhone' 的参数”,呵呵!

以上是关于swift 数组不包含实例变量的主要内容,如果未能解决你的问题,请参考以下文章

将从@escaping接收的值分配给swift中另一个类中的实例变量

Ruby类实例变量和继承

检查Swift数组是不是包含对象实例[重复]

如何判断 Swift 中实例变量的类是啥

Swift 在 Kotlin(或 Java)中的结构?同一类的多个实例,改变其变量

Swift 属性