对于我的项目,我必须创建一个代理AppDelegate,该代理将把调用转发到另一个AppDelegate。
UIApplicationDelegate有一个var window: UIWindow?
。我的问题是,为什么我不能这样做:
private lazy var realAppDelegate: UIApplicationDelegate = {
return AppDelegate()
}()
var window: UIWindow? {
get {
return realAppDelegate.window
}
set {
realAppDelegate.window = newValue
}
}
该代码的问题realAppDelegate.window
是UIWindow??
。
有人知道为什么吗?
该物业window
的UIApplicationDelegate
协议,声明如下:
optional var window: UIWindow? { get set }
这意味着它是一个 可选属性 (在某种意义上,“ 不需要请求 实现UIApplicationDelegate
协议的类
来实现/具有此属性 ”,就像 @optional
在Objective-C中一样),并且该属性 是可选类型
Optional<UIWindow>
(或UIWindow?
) 。
这就是为什么最后要使用double可选类型的原因,因为该window
属性可能会或可能不会在realDelegate中实现,如果是,它将本身为Optional<UIWindow>
/
类型UIWindow?
。
因此,基本上,您想要的只是返回…的window
属性,realAppDelegate
除非realAppDelegate
该属性决定声明该属性本身(因为它不需要这样做optional var
)。
realAppDelegate
未实现window
,那么您可能打算返回a nil
UIWindow?
。realAppDelegate
确实实现了该window
属性,则需要按原样返回它(此实现返回的是实际值UIWindow
还是nil
一个值)。最简单的方法是??
在Swift中使用nil-coalescing运算符。a ??b
意思是“如果a为非nil,则返回a,但如果a为nil,则返回b”(其中if a
是type
T?
,则整个表达式应返回type的对象T
,在您的情况下T
为type UIWindow?
)。
var window: UIWindow? {
get {
// If realAppDelegate.window (of type UIWindow??) is not implemented
// then return nil. Otherwise, return its value (of type UIWindow?)
return realAppDelegate.window ?? nil
// That code is equivalent (but more concise) to this kind of code:
// if let w = realAppDelegate.window { return w } else return nil
}
...
}
要实现安装程序,这是另一个问题。根据这个SO答案,似乎不可能直接访问协议的可选属性的设置器。但是您可以想象有一种破解方法,可以通过声明另一个使该window
属性要求成为强制性的协议,然后尝试在setter中对其进行强制转换来解决此问题:
@objc protocol UIApplicationDelegateWithWindow : UIApplicationDelegate {
var window: UIWindow? { get set }
}
class AppDelegateWrapper : UIApplicationDelegate {
...
var window: UIWindow? {
get {
return realAppDelegate.window ?? nil
}
set {
if let realAppDelWithWindow = realAppDelegate as? UIApplicationDelegateWithWindow
{
// Cast succeeded, so the 'window' property exists and is now accessible
realAppDelWithWindow.window = newValue
}
}
}
...
}
主要内容:1.强制解包,2.自动解包,3.Optional绑定Swift 4还引入了类型,它处理缺少值。 简单的解释是:“有一个值,它等于x”或“根本没有值”。 一个本身就是一种类型,实际上是Swift 4的新超级枚举之一。 它有两个可能的值,和,其中是Swift 4中可用的正确数据类型的关联值。 这是一个的整数声明 - 下面是一个的声明 - 通过以下示例来了解如何在Swift 4中工作 - 当使用playground运行上述程序时,得到以下结果 - 类似于
主要内容:为可选链和访问属性定义模型类,链的多级链接在可选的上查询,调用属性,下标和方法的过程叫作可选链。可选链接返回两个值 - 如果可选项包含值,则调用相关属性,方法和下标返回值。 如果可选项包含值,则所有相关属性,方法和下标返回。 由于对方法,属性和下标的多个查询组合在一起,因此对一个链的失败将影响整个链的结果为值。 可选链作为强制解包的替代方法 在带有的可选值后指定可选链,在可选值返回某些值时调用属性,方法或下标。 可选链 访问方法,属性和下
问题内容: 在Swift中处理可选选项的习惯用法似乎过于冗长,如果您只想在nil为零的情况下提供默认值,则它是: 涉及不必要地复制代码,或 这不需要是常数。 Scala的Option monad(与Swift的Optional基本相同)具有用于此目的的方法: 我想念什么吗?Swift已经有一种紧凑的方式做到这一点吗?否则,是否可以在扩展名中为Optional 定义? 问题答案: 更新资料 苹果现在
描述 (Description) optional关键字允许您在文件不存在时导入文件。 如果要导入的文件不存在且未使用optional关键字,则LESS将抛出FileError错误并停止编译。 此功能在version 2.3.0.中发布version 2.3.0. 例子 (Example) 以下示例演示了在LESS文件中使用optional关键字 - <html> <head>
为 Golang 语言增加动态类型与 Optional 类型,主要使用场景是:旧 PHP/Ruby 系统兼容性升级。
问题内容: 我对iOS和Swift还是陌生的。在我的应用程序中,我试图打印一个可选值,并显示“ Optional(变量的值)”。如何删除这个 可选* 字 * 控制台中的输出是 我正在尝试将此变量分配给UILabel,但在屏幕上却像 1986年9月17日 那样显示 Optional(29) 我的目标是删除这个可选字词,使其看起来像 1986年9月17日(29) 提前致谢 问题答案: 此处使用了可选的