声明延迟属性时,Swift编译器错误与警告相矛盾

时间:2016-03-31 07:19:22

标签: swift casting lazy-initialization

var rawData: NSDictionary!
lazy var nativeData: NativeData? = {
    return NativeData(JSONDictionary: self.rawData as [NSObject : AnyObject])
}()

导致错误:

  

'的NSDictionary&#39!;不能转换为' [NSObject:AnyObject]&#39 ;;没有   你的意思是使用' as!'迫使低垂?

好的,然后......

lazy var nativeData: NativeData? = {
    return NativeData(JSONDictionary: self.rawData as! [NSObject : AnyObject])
}()

发出警告:

  

来自NSDictionary的强制演员!'到[NSObject:AnyObject]'总是   成功;你的意思是使用'作为'?

有趣的是,如果我删除lazy并将nativeData声明为常规可选项,那么我可以完成as广告投放:

obj.nativeData = NativeData(JSONDictionary: obj.rawData as [NSObject : AnyObject])

这是编译器中的错误吗? (Xcode 7.3(7D175))

更新

变得陌生。这是一个包含的案例。

//
//  A.swift
//
import Foundation

class NativeData {
    init(JSONDictionary: [NSObject : AnyObject]) {
    }
}

func == (lhs: A, rhs: A) -> Bool {
    return lhs.id == rhs.id
}

class A {
    var id: Int64 = 0
    var rawData: NSDictionary!
    lazy var nativeData: NativeData? = {
        return NativeData(JSONDictionary: self.rawData as [NSObject : AnyObject])
    }()
}

如果删除func ==运算符定义,则编译器错误消失。 (在我的实际代码中,A符合Equatable。)请注意,如果我将此代码放在游乐场中,则不会发生错误。

0 个答案:

没有答案