【问题标题】:How can I init this kind of Enum which contains properties and no constructor in Swift?如何在 Swift 中初始化这种包含属性且没有构造函数的枚举?
【发布时间】:2025-11-30 13:40:01
【问题描述】:

在 Alamofire 中,我发现有一个枚举:

public enum Result<Value, Error : ErrorType> {
case Success(Value)
case Failure(Error)
/// Returns `true` if the result is a success, `false` otherwise.
public var isSuccess: Bool { get }
/// Returns `true` if the result is a failure, `false` otherwise.
public var isFailure: Bool { get }
/// Returns the associated value if the result is a success, `nil` otherwise.
public var value: Value? { get }
/// Returns the associated error value if the result is a failure, `nil` otherwise.
public var error: Error? { get }
}

在 struct Response 中,我需要给它的构造函数一个 Result。

 public init(request: NSURLRequest?, response: NSHTTPURLResponse?, data: NSData?, result: Alamofire.Result<Value, Error>)

但遗憾的是,我发现 struct Response 内部没有 init,每个属性只有一个 getter。那么如何初始化一个 Response 并使用它来初始化 struct Response?

【问题讨论】:

    标签: swift generics enums alamofire init


    【解决方案1】:

    像这样:

    Response(request: NSURLRequest(), response: NSHTTPURLResponse(), data: NSData(), result: Result<String,NSError>.Success("abc"))
    

    或者这个:

    let result: Result<String,NSError> = .Success("abc")
    Response(request: NSURLRequest(), response: NSHTTPURLResponse(), data: NSData(), result: result)
    

    您需要使用完整的Result&lt;…&gt;,因为 Swift 只能推断出泛型类型参数之一。

    【讨论】:

    • 是的!初始化枚举当然是它的案例。我只是有点困惑,因为枚举中的属性......非常感谢
    【解决方案2】:

    我通常用这个:

    Response(request: NSURLRequest(), response: NSHTTPURLResponse(), data: NSData(), result: Result<String,NSError>.Success("lalala"))
    

    这是最简单的方法。

    【讨论】: