2015-02-08 18 views
6

Đây là một phần mở rộng UIView viết bằng ObjectiveC dễ dàng tạo điểm cho việc sử dụng Auto-layout:Làm thế nào để gọi [tự mới] trong Swift

+(id)autolayoutView 
{ 
    UIView *view = [self new]; 
    view.translatesAutoresizingMaskIntoConstraints = NO; 
    return view; 
} 

nó gọi [self new] vì vậy bất kỳ lớp con của UIView có thể sử dụng phương pháp này. Làm thế nào tôi có thể đạt được điều này trong Swift?

+0

viết dưới dạng danh mục UIView trong objC và chuyển nó thành nhanh? nhanh chóng không phải là thực sự có nghĩa là để được năng động –

Trả lời

5

OK, đây có vẻ là giải pháp. Loại phải có bộ khởi tạo required với danh sách tham số chính xác (trong trường hợp này không có tham số).

class SubView: UIView { 
    override required init() { 
     super.init() 
    } 

    required init(coder aDecoder: NSCoder) { 
     super.init(coder: aDecoder) 
    } 

    class func autolayoutView() -> UIView { 
     var view = self() 
     view.setTranslatesAutoresizingMaskIntoConstraints(false) 
     return view 
    } 
} 
+0

Bạn có thể hiển thị mã chi tiết hơn:) – duan

+0

So với cách ObjC, điều này là khá clunky. Tôi thực sự muốn Swift là một ngôn ngữ hoàn toàn năng động như ObjC, chỉ với một cú pháp rõ ràng hơn. Một cái gì đó như F-Script hoặc nu. –

+0

Có, 'self()' hoạt động. Nhưng bạn không cần phải làm lớp con. Xem câu trả lời của tôi. – duan

1

Lấy cảm hứng từ Gregory Higley, tôi nghĩ rằng giải pháp là đây:

extension UIView{ 
    class func autolayoutView() -> UIView { 
     var view = self() 
     view.setTranslatesAutoresizingMaskIntoConstraints(false) 
     return view 
    } 
} 

Cập nhật cho Swift2.1:

extension UIView{ 
    class func autolayoutView() -> UIView { 
     let view = self.init() 
     view.translatesAutoresizingMaskIntoConstraints = false 
     return view 
    } 
} 
+0

Ah, vâng. Tôi đã bỏ lỡ phần mà bạn nói "UIView extension". –

1

Mặc dù cả hai Carrl và Gregory Higley là đúng với có giải pháp, bao gồm cả nhận xét thr về thực tế là self() cần sử dụng init bắt buộc tôi muốn đăng một ví dụ tổng quát hơn:

class Human { 
    var gender = String() 
    required init() { 
     self.gender = "any" 
    } 
    class func newHuman() -> Human { 
     return self() 
    } 
} 

class Man : Human { 
    required init() { 
     super.init() 
     self.gender = "male" 
    } 
} 

var someMan = Man.newHuman() 
println(someMan.gender) // male 
+0

Đây gần như chính xác cùng mã tôi đã sử dụng trong thử nghiệm sân chơi của mình, ngoại trừ tôi đã sử dụng 'Foo' và' Bar' ít trí tưởng tượng hơn. –

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