2017-04-15 26 views
4

我使用這個結構,並使用該迅速3.0.2給出了雄心勃勃的錯誤「」類型「布爾」壞」

struct Ride { 
    var isRideForNow: Bool!  
} 
var sheduleRide: Ride? 
sheduleRide = Ride() 
sheduleRide?.isRideForNow = false 

當我使用這樣它工作正常

if (sheduleRide?.isRideForNow)! { 
    //some code 
} 

但我不知道爲什麼下面的代碼給錯誤「類型‘布爾’壞」,甚至還有這裏面

if (sheduleRide!.isRideForNow) { 
    //some code 
} 
+0

時間表坐的是可選的I guess.so第一選項的工作不是第二。 –

+0

好的,但爲什麼我sheduleRide!明確解開打破可選的事情。 – SuryaKantSharma

+1

請在swift 3.1 – SuryaKantSharma

回答

6

沒有可選鏈接這是一個無用的埃羅r消息 - 它只出現在Swift版本3.0到3.0.2中。問題在於,Swift並沒有隱含地展開可選項,因爲它認爲你正在嘗試執行可選的檢查。

因此,溶液,as @vacawama says,是簡單地明確地解開的可選的:

if sheduleRide!.isRideForNow! { 
    // some code 
} 

(這當然會崩潰,如果任一sheduleRideisRideForNownil

然而,事實證明夫特ISN在我看來,在這裏隱含地解開IUO並不符合在SE-0054中詳述的IUO行爲 - 因爲IUO應該被視爲強選項,他們可以像他們那樣進行類型檢查,否則應該被隱式地解開。

在一個布爾條件中,編譯器無法對錶達式進行類型檢查,因爲它是一個強選項,因此確實應該應該被隱式解包。這種行爲是filed as a bug和固定in this pull request,這樣的聲明:

if sheduleRide!.isRideForNow { 
    // some code 
} 

現在雨燕3.1編譯罰款。

但是真的,as @vadian says,你應該考慮isRideForNow是否應該是一個IUO。如果需要延遲初始化(否則
lazy),您應該只做一個。

如果你給它初始化時的值,那麼就可以非可選:

struct Ride { 
    var isRideForNow: Bool 
} 

var sheduleRide = Ride(isRideForNow: false) 
+1

這裏有很多事情要做,包括當恐龍在地球上漫遊時,可能會檢查一個可選項是否爲'if myOptionalVar {// not nil}',但當變量爲'Bool'時會引起混淆? '和'布爾!'。 – vacawama

+1

@vacawama事實上,這真的是對'nil' /'NULL'的(Obj-)C行爲的測試,我很高興它被刪除了。我認爲,對於最不讓人吃驚的原則,if語句中'Bool!'/'Bool?'表達式的當前(Swift 3.1)行爲具有正確性。雖然真的爲了完全沒有驚喜的體驗,但儘可能避免IUO是一種好方法:) – Hamish

+1

*宿醉*在這種情況下比* holdover *好得多:-)。我完全同意,強烈建議儘可能避免IUO。 – vacawama