2016-09-21 29 views
-3

我已經在Swift中創建了我自己的類,如下所示。Swift中奇怪的可選行爲

class Product: NSObject { 

    var product_id:Int? 
    var product_number:String? 
    var product_price:Float? 
    var product_descrption:String? 
} 

現在我在每個屬性這樣

 let p=Product() 
     p.product_id=1 
     p.product_price=220.22 
     p.productdescrption="Some description" 
     p.product_number="W2_23_233" 

設定值但是當我從價值,那麼價格我得到價值像「可選220.22」,但我不在描述獲得附加詞「可選」」。所以要解決這個我添加‘!’的展開浮動的價值,但我沒有爲〜應變做到這一點g請說明爲什麼會發生這種情況?

+1

你沒有解開該字符串,因爲無論您使用該字符串函數不需要解包值,您應該使用可選類型時聲明只有當值可以爲零,如果不是,那麼不需要使用它 – Tj3n

+1

如果您打印'p.product_number',它也會用'optional'打印。 –

+0

我不明白爲什麼有人把它投下來。 –

回答

0

如果您正在打印任何這些值應該說可選(...)。如果您將值分配給標籤,那麼將不包含可選(...),當您使用print()打印該值時,它顯示可選(...)的原因是爲了向您顯示其值可選的。爲了安全起見,不要使用!,請嘗試使用if let。

與您的代碼示例,

if let id = p.product_id { 
    print(id) //Does not contain Optional() 
} 

您也可以將它們組合起來,做他們都在同一時間。 (只有做到這一點,如果你不希望打印,除非所有值不爲零)

if let id = p.product_id, 
    let price = p.product_price, 
    let description = p.productdescrption, 
    let productNumber = p.product_number { 
     //Enter code here that does something with these values 
} 

注意,如果你不是在迅速3,我相信你只需要編寫讓第一個條件。

0

如果打印任何可選變量而不展開,無論它是什麼類型,Optional都會附加到變量的值。

print(p.product_price)將打印可選(220.220001)

print(p.product_descrption)將打印可選( 「一些說明」)

打印唯一的價值,你需要解開的可選變量。

print(p.product_price!)將打印220.22

print(p.product_descrption!)將打印一些描述

這迫使解纏如果自選不含nil纔會工作。否則,它會給你一個運行時錯誤。 因此要檢查nil,您可以使用if let聲明。

0

無論什麼類型的變量。如果一個值賦給一個可選變量,它總是附帶可選(...)

可選無強制解包:

print("product_price = \(p.product_price) \n product_descrption = \(p.product_descrption)") 

輸出:
PRODUCT_PRICE =可選(220。22)
product_descrption =可選的(有些描述)

可選帶強制解包:

print("product_price = \(p.product_price!) \n product_descrption = \(p.product_descrption!)") 

輸出:
PRODUCT_PRICE = 220.22
product_descrption =有些描述