ios – 在易错初始化程序swift 1.2中分配let变量

ios – 在易错初始化程序swift 1.2中分配let变量,第1张

概述我有一个带有易错初始化程序的结构,不是实例方法,而是初始化程序.更新到1.2后,当我尝试在初始化程序中分配一个let属性时,我收到以下错误无法在self中分配给’aspectRatio’.我的代码如下: import Foundationpublic struct MediaItem{public let url: NSURL!public let aspectRatio: Double 我有一个带有易错初始化程序的结构,不是实例方法,而是初始化程序.更新到1.2后,当我尝试在初始化程序中分配一个let属性时,我收到以下错误无法在self中分配给’aspectRatio’.我的代码如下:
import Foundationpublic struct MediaItem{public let url: NSURL!public let aspectRatio: Doublepublic var description: String { return (url.absoluteString ?? "no url") + " (aspect ratio = \(aspectRatio))" }// MARK: - Private Implementationinit?(data: NSDictionary?) {    var valID = false    if let urlString = data?.valueForKeyPath(TwitterKey.MediaURL) as? Nsstring {        if let url = NSURL(string: urlString as String) {            self.url = url            let h = data?.valueForKeyPath(TwitterKey.Height) as? NSNumber            let w = data?.valueForKeyPath(TwitterKey.WIDth) as? NSNumber            if h != nil && w != nil && h?.doubleValue != 0 {                aspectRatio = w!.doubleValue / h!.doubleValue                valID = true            }        }    }    if !valID {        return nil    }}struct TwitterKey {    static let MediaURL = "media_url_https"    static let WIDth = "sizes.small.w"    static let Height = "sizes.small.h"}}

我的问题是我该怎么做才能解决这个问题?

解决方法 Swift 1.2已经关闭了与let属性有关的漏洞:

The new rule is that a let constant must be initialized before use (like a var),and that it may only be initialized,not reassigned or mutated after initialization.

该规则正是您试图违反的规则. aspectRatio是一个let属性,你已经在它的声明中给它一个值:

public let aspectRatio: Double = 0

因此,在我们到达初始化程序之前,aspectRatio的初始值为0.这是它可以拥有的唯一值.新规则意味着您永远不能再分配给aspectRatio,即使在初始化程序中也是如此.

解决方案是(这始终是正确的方法):在声明中没有给它赋值:

public let aspectRatio: Double

现在,在初始化程序中,将其指定为0或指定它!.doubleValue / h!.doubleValue.换句话说,一次处理初始化程序中的所有可能性.无论如何,这将是唯一一次为aspectRatio分配值的时间.

如果你考虑一下,你会发现这是一种更明智和一致的方法;以前,你对let的含义有点搪塞,新规则已经阻止了你这样做.

在重写代码时,如果您想要挽救并返回nil,则无法初始化所有属性.我知道这似乎违反直觉,但你做不到.即使您打算纾困,也必须初始化所有属性.我非常清楚地讨论这个问题in my book:

A failable class initializer cannot say return nil until after it has completed all of its own initialization dutIEs. Thus,for example,a failable subclass designated initializer must see to it that all the subclass’s propertIEs are initialized and must call super.init(...) before it can say return nil. (There is a certain delicIoUs irony here: before it can tear the instance down,the initializer must finish building the instance up.)

编辑:请注意,从Swift 2.2开始,此要求将被取消.在初始化属性之前返回nil是合法的.这将使类初始化器与struct初始化器相提并论,这已经是合法的.

总结

以上是内存溢出为你收集整理的ios – 在易错初始化程序swift 1.2中分配let变量全部内容,希望文章能够帮你解决ios – 在易错初始化程序swift 1.2中分配let变量所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1107267.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存