2014-10-10 28 views
5

Làm thế nào để bạn khởi tạo một kiểu động dựa trên giá trị tra cứu trong từ điển trong Swift?Tạo đối tượng Swift từ một từ điển

+1

Đáng tiếc là bây giờ bạn đã chỉnh sửa câu hỏi trong số tất cả công nhận. Nó không còn rõ ràng những gì các câu hỏi được hoặc những gì đây là giải pháp cho. Nó sẽ là tốt hơn để trở lại câu hỏi ban đầu và đặt câu trả lời như là một câu trả lời, không phải là một chỉnh sửa của câu hỏi mà ghi đè câu hỏi ban đầu. – matt

+0

Vâng, không còn là một câu hỏi nữa. Tôi đã làm cho nó thành một câu hỏi bây giờ, là tốt hơn? Hay tôi nên quay lại? – possen

+1

Về cơ bản bạn không thể làm điều đó chút nào trong Swift. Tuy nhiên bạn có thể làm điều đó trong Objective-C và Swift hoàn toàn có khả năng tương tác với các đối tượng Objective-C. Lưu ý rằng bất cứ thứ gì subclassing NSObject không phải là một đối tượng nhanh, nó là một đối tượng Objective-C. Chúng hoạt động chủ yếu giống nhau, nhưng Objective-C có thể năng động, nhưng có những hạn chế khác (ví dụ: chúng chậm hơn nhiều). –

Trả lời

4

Hy vọng điều này hữu ích cho người khác. Phải mất một số nghiên cứu để tìm ra điều này. Mục đích là để tránh các mô hình của các câu lệnh if hoặc switch khổng lồ để tạo ra từng loại đối tượng từ một giá trị.

class NamedItem : CustomStringConvertible { 
    let name : String 

    required init() { 
     self.name = "Base" 
    } 

    init(name : String) { 
     self.name = name 
    } 

    var description : String { // implement Printable 
     return name 
    } 
} 

class File : NamedItem { 
    required init() { 
     super.init(name: "File") 
    } 
} 

class Folder : NamedItem { 
    required init() { 
     super.init(name: "Folder") 
    } 
} 

// using self to instantiate. 
let y = Folder.self 
"\(y.init())" 

let z = File.self 
"\(z.init())" 

// now put it in a dictionary. 
enum NamedItemType { 
    case Folder 
    case File 
} 

var typeMap : [NamedItemType : NamedItem.Type] = [.Folder : Folder.self, 
                .File : File.self] 
let p = typeMap[.Folder] 
"\(p!.init())" 
let q = typeMap[.File] 
"\(q!.init())" 

khía cạnh thú vị:

  • sử dụng "cần thiết" cho initializers
  • sử dụng .Type để có được những loại cho giá trị từ điển.
  • sử dụng .self để nhận "lớp" có thể được tạo ra
  • sử dụng() để khởi tạo đối tượng động.
  • sử dụng Giao thức có thể in để nhận các giá trị chuỗi ngầm định.
  • cách bắt đầu sử dụng init không được tham số hóa và nhận các giá trị từ khởi tạo lớp con.

cập nhật để Swift 3,0 cú pháp

+2

Tôi tìm thấy sự khai sáng này. Cảm ơn bạn đã chia sẻ nghiên cứu của mình. – vacawama

+0

cảm ơn đề xuất của bạn trước đó. – possen

Các vấn đề liên quan