2014-07-03 38 views
11

İsteğe bağlı bağlamayı desteklemek için Swift (Int, Float ...) değer türlerinin nasıl uygulandığını merak ediyorum ("?"). Bu değer türlerinin yığında değil, yığında ayrıldığını varsayalım. Yani, boş olabileceği yığına bir tür göstericiye mi güveniyorlar yoksa temel yapı bir boole bayrağı içeriyor mu?Swift'de isteğe bağlı değerler nasıl uygulanır?

+0

Bonus: Verilen bir Swift tohum için böyle bir cevap bulabilirsiniz how ve: kim bilinenler cevap (sadece gelecekte değişiklik olması durumunda) –

+0

olası kopyası [Swift dilinde bir ünlem işareti nedir?] (http://stackoverflow.com/questions/24018327/what-does-an-exclamation-mark- ortalama-in-the-hızlı-dil) – Sulthan

cevap

11

İsteğe bağlı özellikler, Swift'de enum türü olarak uygulanır.

Bu yapıldığında nasıl bir örnek için Apple's Swift Tour bakınız: aşağıda gösterildiği gibi

enum OptionalValue<T> { 
    case None 
    case Some(T) 
} 
+0

Ayrıca, 'ImplicitlyUnwrappedOptional' adlı başka bir türü vardır. – Sulthan

+6

ve sonra sanırım soru olurdu ... enums nasıl uygulandı? :) – newacct

+0

* Etiketli sendikaların * kullanıldığı her bir değerin kendisiyle ilişkili bir etiketin olduğu anlamına gelir. Başka nasıl saklayabilirsin? – wcochran

3

Opsiyoneller uygulanmaktadır. Bunu bulmak için, CMD-Click var x: Optional<Int> gibi bir bildirimde. var x: Int? bunun için sadece sözdizimsel şekerdir.

enum Optional<T> : LogicValue, Reflectable { 
    case None 
    case Some(T) 
    init() 
    init(_ some: T) 

    /// Allow use in a Boolean context. 
    func getLogicValue() -> Bool 

    /// Haskell's fmap, which was mis-named 
    func map<U>(f: (T) -> U) -> U? 
    func getMirror() -> Mirror 
} 
9

Swift, dünden beri açık kaynak. Sen GitHub üzerinde uygulanmasını görebilirsiniz: cevapların çoğu

public enum Optional<Wrapped> : ExpressibleByNilLiteral { 

    case none 
    case some(Wrapped) 

    public init(_ some: Wrapped) { self = .some(some) } 

    public init(nilLiteral:()) { 
     self = .none 
    } 

    public var unsafelyUnwrapped: Wrapped { 
     get { 
      if let x = self { 
       return x 
      } 
      _debugPreconditionFailure("unsafelyUnwrapped of nil optional") 
     } 
    } 
} 
2

https://github.com/apple/swift/blob/master/stdlib/public/core/Optional.swift basitçe Swift opsiyoneller is enum ler nasıl uygulandığını daha sonra soruları yalvarır enum s ile uygulanmaktadır söylüyorlar. ile etiketlenmiş birleşik C numaralı etiket kullanılmalıdır. Örneğin, Swift enum için

enum Foo { 
    case None 
    case Name(String) 
    case Price(Double) 
} 
şöyle

C mimick'ed olabilir:

enum {FOO_NONE_, FOO_NAME_, FOO_PRICE_}; 
typedef struct { 
    int flavor; // FOO_NONE_, FOO_NAME_ or FOO_PRICE_ 
    union { 
     char *Name; // payload for FOO_STRING_ 
     double Price; // payload for FOO_DOUBLE_ 
    } u; 
}