Can';在处理初始化错误时,不能在Swift结构中初始化常量

Can';在处理初始化错误时,不能在Swift结构中初始化常量,swift,swift2,Swift,Swift2,这个标题是不言自明的。代码如下: struct APIConnection { enum APIConnectionError: ErrorType { case InvalidRegion(invalidRegion:String) } let validRegions:Set<String> = ["na","eune","euw","kr","lan","las","br","oce","ru"] let apiKey:String, region:Strin

这个标题是不言自明的。代码如下:

struct APIConnection {

enum APIConnectionError: ErrorType {

    case InvalidRegion(invalidRegion:String)
}


let validRegions:Set<String> = ["na","eune","euw","kr","lan","las","br","oce","ru"]

let apiKey:String, region:String
var url:NSURL!

init(region:String,apiKey:String) {

    func setRegion() throws {

        if self.validRegions.contains(region) { self.region = region } // Can't assing since region is a let constant
        else { throw APIConnectionError.InvalidRegion(invalidRegion: region) }
    }

        do { try setRegion() } /* If I change region to a var, compiler says setRegion() utilizes a yet non-initialized
            apiKey constant. */
        catch APIConnectionError.InvalidRegion(let invalidRegion) { print("Invalid region: \(invalidRegion)") }
        catch let unknownError { print("Unknown error: \(unknownError)") }
}

}
 func isRegionValid(region:String) throws -> Bool{

            if self.validRegions.contains(region) { return true } // Can't assing since region is a let constant
            else { throw APIConnectionError.InvalidRegion(invalidRegion: region) }
        }

        do { if try isRegionValid(region) { self.region = region } }

但是,我仍然收到一个错误,说闭包“setRegion()”正在捕获api键的值,我不知道为什么。

我认为您粘贴的代码不正确,因为您的初始值设定项中有一个函数声明。我猜这是因为您的赋值不直接在init()中,关于分配给常量的常规规则不适用。但是init()不是一个闭包吗?据我所知,我可以将一个闭包嵌套在另一个闭包中。如果我错了,请纠正我!那么,我需要在init中设置常量?不在任何其他类型的方法/附件中?仅编辑。如果我在处理区域类型之前声明了apiKey的值,那么代码的编译似乎没有问题。然而,我仍然不确定为什么会发生这种情况,最重要的是:首先设置apiKey的值是一个好主意,还是一种糟糕的编码实践?