扩展无法在运行时访问通用参数

时间:2017-01-17 14:58:43

标签: objective-c swift amazon-web-services swift3 amazon-cognito

我正在使用AWS Cognito,在文档中我说我必须添加此功能。

但是我收到了这个错误:

泛型Objective-C类的扩展无法在运行时访问类的泛型参数

extension AWSTask {
    public func continueWithExceptionCheckingBlock(completionBlock:@escaping (_ result: Any?, _ error: Error?) -> Void) {
        self.continue({(task: AWSTask) -> Any? in
            if let exception = task.exception {
                print("Fatal exception: \(exception)")
                kill(getpid(), SIGKILL);
            }
            let result: AnyObject? = task.result
            let error: NSError? = task.error as NSError?
            completionBlock(result, error)
            return nil
        })

    }
}

4 个答案:

答案 0 :(得分:18)

对于在 Swift 4 中遇到此问题的用户,请尝试在方法中添加@objc修饰符。请找到以下示例:

extension NSLayoutAnchor {

    @objc func constrainEqual(_ anchor: NSLayoutAnchor<AnchorType>, constant: CGFloat = 0) {
        let constraint = self.constraint(equalTo: anchor, constant: constant)
        constraint.isActive = true
    }
}

答案 1 :(得分:6)

没有上下文我不能说你是否实际上正在做错误消息提示你的,但是有一个开放的错误报告描述了这个问题(实际上没有使用任何违规代码):

  

<强> ObjC

@interface MySet<T : id<NSCopying>> : NSObject
@end
     

<强>夫特

class Foo { }
struct Bar { }

extension MySet {
    func foo() -> Foo { return Foo() }
    func bar() -> Bar { return Bar() }
}
     

两种扩展方法都导致“泛型Objective-C类的扩展无法访问类的泛型参数   运行时“。然而,两者都没有真正做到这一点(至少   没有明确地说。)

如果您阅读错误报告的评论,您会注意到用户'Vasili Silin'在尝试扩展AWSTask时描述了此问题,因此您可能必须考虑其他方法,直到此错误已经解决了。

答案 2 :(得分:3)

我遇到了同样的错误并以这种方式解决:

  

扩展yourClass,其中T == yourType {}

答案 3 :(得分:1)

我面临以下问题:

  

错误:“通用的Objective-C类的扩展无法在运行时在Swift 4.2和Xcode 10.2.1中访问该类的通用参数”

我正在使用以下版本的反应性库:

活性可可粉(10.0.0), ReactiveObjC(3.1.1), ReactiveSwift(6.0.0), 结果(4.1.0), Xcode:10.2.1 迅捷版:4.2

代码段:

import Foundation
import ReactiveObjC
import ReactiveSwift

extension RACSignal {
    /// Create a `SignalProducer` which will subscribe to the receiver once for
    /// each invocation of `start()`.
    ///
    /// - parameters:
    ///   - file: Current file name.
    ///   - line: Current line in file.
    ///
    /// - returns: Signal producer created from `self`.
    public func toSignalProducer(file: String = #file, line: Int = #line) -> SignalProducer<AnyObject?, NSError> {
        return SignalProducer { observer, disposable in
            let next: (Any?) -> Void = { obj in
                observer.send(value: obj as AnyObject?)
            }

            let failed: (Error?) -> Void = { nsError in
                observer.send(error: nsError as NSError? ?? NSError(domain: "Nil RACSignal error", code: -1, userInfo: [:]))
            }

            let completed = {
                observer.sendCompleted()
            }

            disposable += self.subscribeNext(next, error: failed, completed: completed)
        }
    }
}

由于这个问题,我们被封锁了。

有人遇到过同样的问题并找到了解决方法吗?