Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
swift代码中的崩溃:“;已将无法识别的选择器发送到实例";_Swift - Fatal编程技术网

swift代码中的崩溃:“;已将无法识别的选择器发送到实例";

swift代码中的崩溃:“;已将无法识别的选择器发送到实例";,swift,Swift,我正在尝试编写一个发出HTTP请求的命令行Swift应用程序。作为旁注,我想为应用程序的runfunc提供一个会话,以便使用依赖注入对代码进行单元测试(因此我定义了协议) 这会导致“无法识别的选择器发送到实例”崩溃。这是什么意思 // // main.swift // MockIt // // import Foundation public protocol URLSessionProtocol { func synchronousDataTask( _ url: URL )

我正在尝试编写一个发出HTTP请求的命令行Swift应用程序。作为旁注,我想为应用程序的
run
func提供一个会话,以便使用依赖注入对代码进行单元测试(因此我定义了协议)

这会导致“无法识别的选择器发送到实例”崩溃。这是什么意思

//
//  main.swift
//  MockIt
//
//

import Foundation

public protocol URLSessionProtocol {
    func synchronousDataTask( _ url: URL ) -> ( Data?, URLResponse?, Error? )
}

class MyUrlSession : URLSession, URLSessionProtocol {

    func synchronousDataTask( _ url: URL ) -> ( Data?, URLResponse?, Error? ) {
        var data: Data?
        var response: URLResponse?
        var error: Error?

        let semaphore = DispatchSemaphore(value: 0)

        let dataTask = self.dataTask(with: url) {
            data = $0
            response = $1
            error = $2

            semaphore.signal()
        }
        dataTask.resume()

        _ = semaphore.wait(timeout: .distantFuture)

        return (data, response, error)
    }

}

class MyModule {
    func run( _ session: URLSessionProtocol, _ urlString: String ) {
        let url = URL(string: urlString)
        let ( _, response, _ ) =
            session.synchronousDataTask(url!)
        print( response! )
    }
}


MyModule().run( MyUrlSession(), "https://myapiendpoint.com" )
全面崩溃发生在这里:

2017-04-12 11:29:07.930076 MockIt[33267:1871173] -[MockIt.MyUrlSession dataTaskForRequest:completion:]: unrecognized selector sent to instance 0x100a043d0
2017-04-12 11:29:07.933897 MockIt[33267:1871173] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[MockIt.MyUrlSession dataTaskForRequest:completion:]: unrecognized selector sent to instance 0x100a043d0'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff785dfe7b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x00007fff8d1c0cad objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff78661cb4 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3   CoreFoundation                      0x00007fff78551fb5 ___forwarding___ + 1061
    4   CoreFoundation                      0x00007fff78551b08 _CF_forwarding_prep_0 + 120
    5   MockIt                              0x000000010000177d _TFC6MockIt12MyUrlSession19synchronousDataTaskfV10Foundation3URLTGSqVS1_4Data_GSqCSo11URLResponse_GSqPs5Error___ + 477
    6   MockIt                              0x0000000100001bf8 _TTWC6MockIt12MyUrlSessionS_18URLSessionProtocolS_FS1_19synchronousDataTaskfV10Foundation3URLTGSqVS2_4Data_GSqCSo11URLResponse_GSqPs5Error___ + 72
    7   MockIt                              0x0000000100001d1d _TFC6MockIt8MyModule3runfTPS_18URLSessionProtocol_SS_T_ + 253
    8   MockIt                              0x0000000100001584 main + 116
    9   libdyld.dylib                       0x00007fff8daa4255 start + 1
    10  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 
不确定这是否重要,但这是我的应用程序目录的一般结构:

$ tree -L 2
.
├── DerivedData
│   ├── Build
│   ├── MockIt
│   └── ModuleCache
├── MockIt
├── MockIt-Bridging-Header.h
├── MockIt.xcodeproj
│   ├── project.pbxproj
│   ├── project.xcworkspace
│   └── xcuserdata
├── MockItTest
│   ├── Info.plist
│   └── MockItTest.swift
└── main.swift

URLSession
不是为子类而设计的

我认为您看到的问题源于这样一个事实:您没有完全初始化
URLSession
子类。您正在调用
init()
,此时
URLSession
至少要通过
init(configuration:)
初始化一个配置对象

您不能从子类中自己调用这些初始值设定项,因为它们已被特别标记为不可继承

您不能自己分配给configuration属性,因为它是只读属性

您可以通过重写属性来绕过这个问题,但几乎可以肯定,最好不要将
URLSession
子类化。您是否考虑过将此作为扩展

这里有更多的信息