2014-11-19 17 views
14

Trong C#, chúng tôi có Initializers Object, như vậy:Swift có một Trình khởi tạo đối tượng ngầm, như trong C#?

Person obj = new Person 
    { 
     FirstName = "Craig", 
     LastName = "Playstead", 
    }; 

Liệu Swift có điều này?

Như một ví dụ, tôi có mã này:

var config = IndicatesConfig() 
config.name = NSLocalizedString(Localizable.FOLDERS, comment: "").uppercaseString 
config.style = .DetailHeader 
return config 

Nhưng muốn làm một cái gì đó dọc theo dòng:

var config = IndicatesConfig() { 
    name = NSLocalizedString(Localizable.FOLDERS, comment: "").uppercaseString 
    style = .DetailHeader 
} 

Cảm ơn bạn!

chỉnh sửa:

Tôi không tham chiếu đến định nghĩa rõ ràng của lớp khởi tạo. Xin lưu ý cú pháp được hiển thị trong ví dụ C#.

+0

[các Swift Ngôn ngữ lập trình khởi] (https://developer.apple.com/library/ios/documentation/swift/conceptu al/Swift_Programming_Language/Initialization.html) –

+0

Và bạn không tìm thấy câu trả lời trong sách Swift của Apple? Có thật không? – dasdom

+3

Tại sao bỏ phiếu xuống? Không, tôi không biết. Tôi mở nó ở đây. Có lẽ tôi không đủ rõ ràng. Tôi đã không tham chiếu đến định nghĩa của initialisers lớp. – nmdias

Trả lời

15

Không phải như vậy. Nếu bạn tạo một tuỳ chỉnh struct, Swift sẽ, trong một số điều kiện nhất định, hãy tạo một default memberwise initializer gần với những gì bạn đang tìm kiếm. Nhưng nếu không, tôi không nghĩ rằng thậm chí có một cách để thực hiện một tính năng như vậy, vì Swift thiếu bất cứ thứ gì giống như một từ khóa with sẽ đưa bạn vào phạm vi của cá thể mới.

Cập nhật: này là càng gần như tôi có thể nhận được, bằng cách định nghĩa một nhà điều hành tùy chỉnh:

infix operator <| { } 

func <|<T>(decl: @autoclosure() -> T, f: T ->()) -> T { 
    let obj = decl() 
    f(obj) 
    return obj 
} 

let label = UILabel() <| { 
    $0.frame = CGRect(x: 10, y: 10, width: 300, height: 25) 
    $0.text = "Hello" 
    $0.enabled = false 
} 

println(label) 
// <UILabel: 0x7fb46240b210; frame = (10 10; 300 25); text = 'Hello'; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x7fb46240c2b0>> 
+1

Nếu bạn đang xác định 'tương đương' của riêng mình và không thích tất cả '$ 0' đó, bạn cũng có thể sử dụng cú pháp đặt tên tham số đóng ngắn: ví dụ: 'let label = UILabel() <| {v in v.frame = ...; v.text = ...; v.enabled = ...} ' – rickster

+0

Điều này thật tuyệt. 'f' có thể được chú thích bằng' @ noescape' trong Swift 1.2. Nhưng tại sao bạn làm cho 'decl' một hàm thay vì chỉ là một' T'? –

+0

trong nguyên mẫu hàm Swift2.2 phải thay đổi thành 'func <| (@autoclosure decl:() -> ...' – farzadshbfn

7

Swift không có tính năng như vậy.

Bạn có thể thực hiện giao diện tương tự như sử dụng đóng cửa, nhưng ...

class MyClass { 
    var name = "" 
    var style = 0 
    init(initializer:((MyClass)->Void)? = nil) { 
     initializer?(self) 
    } 
} 

let a = MyClass2() { 
    $0.name = "foo" 
    $0.style = 2 
} 

Không có tiềm ẩn self đây, thay vào đó, bạn phải sử dụng tham số đóng cửa ngầm $0.

3

Có thể tôi không hiểu, nhưng Swift có trình khởi tạo. Theo mặc định, khởi tạo không có bất kỳ thông số, nhưng bạn luôn có thể thêm initializers bổ sung mà mất bất kỳ số lượng các thông số ...

class MyClass { 
    var _name: String 
    var _style: Int = 0 

    init() { 
    _name = "" 
    } 
    init(_ name : String) { 
    _name = name 
    } 
} 

Nếu bạn muốn thêm một initializer, bạn có thể viết một phần mở rộng

extension MyClass { 
    convenience init(_ name: String, style: Int) { 
    self.init(name) 
    _style = style 
    } 
} 

sau đó, bạn có thể nhanh chóng đối tượng này sử dụng bất kỳ những điều sau đây:

var a = MyClass() 
var b = MyClass("Billy") 
var c = MyClass("Jimmy", 5) 
+2

Ngoài dấu gạch dưới của bạn, đây là giải pháp thích hợp – Jessy

+1

Đây không phải là những gì OP đang nói đến. về trình khởi tạo mà bạn không phải viết theo cách thủ công và có thể tùy chọn cung cấp các giá trị cho – Zag

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