2017-09-12 99 views
0

我很困惑,我遇到過幾次。我有時會收到類似以下無法轉換類型'Foo!'的值到預期的參數類型'Foo!'

Cannot convert value of type 'Foo!' to expected argument type 'Foo!

'

我已經搜查SO錯誤,但還沒有真正發現任何可以解釋爲什麼富!和Foo不一樣!

下面是一個例子:

// FooViewModel.swift 
class FooViewModel: BaseViewModel { 
    fileprivate var foo: Foo! 
    fileprivate var bar: Bar = Bar() 

    init!(model: Foo!) { 
     super.init() 
     foo = model 
    } 

    override init() { 
     super.init() 
    } 

    func setFooModel(_ model: Foo!) { 
     self.foo = model 
    } 

    func getFooModel() -> Foo! { 
     return self.foo 
    } 

    func getBar() -> Bar { 
     return bar 
    } 

    func getBlah() -> String { 
     return "Blah" 
    } 
} 

這裏是單元測試生成錯誤:

import XCTest 
@testable import WooHoo 

class FooViewModelTests: XCTestCase { 

    override func setUp() { 
     super.setUp() 
    } 

    override func tearDown() { 
     super.tearDown() 
    } 

    func testGetBar() { 
     var foo = Foo() 
     let vm = FooViewModel() 

     // The following line generates the error 
     vm.setFooModel(foo) 

     XCTAssertEqual("Tell us your Foo for the Bar program.", vm.getBlah()) 
    } 
} 

我已經嘗試了多種變型爲vm.setFooModel(foo)無濟於事,例如vm.setFooModel(foo!)或將foo聲明爲var foo: Foo! = Foo()

編輯: 請注意,上面的代碼是用於說明我遇到的問題,而不是操作代碼。

+0

「Foo」類型聲明在哪裏?是否有可能在不同範圍內聲明多個'Foo'? –

+2

我認爲在聲明變量foo時只需要使用'Foo!',而在其他地方只需使用'Foo' – 3stud1ant3

+0

'setFooModel'和'getFooModel'方法有什麼意義?爲什麼不公開'foo'屬性? 'getBar'方法相同。爲什麼不簡單地使公共閱讀訪問的'bar'屬性? – rmaddy

回答

0

我明白了這一點。我的視圖模型是測試目標的一部分。將其設置爲僅限運行目標後,問題就解決了。僅供參考。

相關問題