2015-06-18 18 views
10

Tuôn ra với sự phấn khích khi mở rộng Bool, tôi nghĩ sẽ rất vui khi mở rộng các đóng cửa trong Swift (chúng tôi đã làm điều này mà không phiền phức chút nào trong Smalltalk, vậy tại sao không?).Không thể mở rộng đóng cửa trong Swift?

Dưới đây là sân chơi của tôi:

typealias NiladicClosure =() ->() 

extension NiladicClosure { 
    var theAnswerToLife:Int { 
     return 42 
    } 
} 

let block:NiladicClosure = {} 

block.theAnswerToLife 

Nó không làm việc, nói rằng NiladicClosure does not have a member named 'theAnswerToLife'. Nhìn vào bảng điều khiển, tôi có thêm thông tin một chút:

Playground execution failed: /var/folders/2k/6y8rslzn1m95gjpg534j7v8jzr03tz/T/./lldb/33726/playground119.swift:3:1: error: non-nominal type 'NiladicClosure' cannot be extended 
extension NiladicClosure { 
^   ~~~~~~~~~~~~~~ 

non-nominal type là gì? Có mô hình/cách giải quyết không?

Các câu hỏi tương tự khác được đặt trước Swift 2, cũng đủ cụ thể để mọi người cung cấp giải pháp cho phần mở rộng cụ thể. Tôi quan tâm đến việc liệu Swift đóng cửa có phải là đối tượng lớp đầu tiên mà tôi có thể thêm hành vi bổ sung vào, giống như những thứ khác trong Swift.

+1

Bạn không thể mở rộng việc đóng cửa. So sánh http://stackoverflow.com/questions/28317625/can-i-extend-tuples-in-swift (đó là về việc mở rộng các bộ dữ liệu, nhưng cùng một câu trả lời áp dụng cho các hàm/đóng). –

+0

Bất kỳ ý tưởng _WHY_ tuples và đóng cửa không mở rộng? Trong trường hợp đóng cửa, có phải vì các bao đóng không bao giờ thực sự được hợp nhất với một đối tượng thực sự (hay cấu trúc)? (ít nhất, tôi không thể thấy bất cứ nơi nào họ làm) –

+1

@TravisGriggs Đó là "[chủ yếu là một giới hạn thực hiện] (https://twitter.com/jckarter/status/611656674391097344)". –

Trả lời

8

Loại không phải là danh nghĩa là gì?

A nominal type là loại có tên rõ ràng. Loại không phải danh nghĩa là loại không có tên như vậy, chẳng hạn như () ->(). Các loại hợp chất, bao gồm cả các bao đóng và bộ dữ liệu (chẳng hạn như (Int, String)) không thể được gia hạn.

Có mẫu/giải pháp khác không?

Bạn có thể sử dụng thành phần thay vì các phần mở rộng, có lẽ sử dụng các tính năng giao thức mới Swift 2 của:

typealias NiladicClosure =() ->() 

protocol NiladicClosureProtocol { 
    var someClosure : NiladicClosure? {get} 
} 

protocol SorryForTheInconvenience { 
    var theAnswerToLife : Int {get} 
} 

extension SorryForTheInconvenience { 
    var theAnswerToLife : Int { 
     return 42 
    } 
} 

struct SomethingAwesome : NiladicClosureProtocol, SorryForTheInconvenience { 
    var someClosure : NiladicClosure? 
} 

let foo = SomethingAwesome() 
foo.theAnswerToLife // 42 
+0

"Bạn có thể sử dụng bố cục thay vì tiện ích, có thể sử dụng các tính năng giao thức mới của Swift 2". Tôi không chắc nó sẽ hoạt động ra sao. Tôi có thể thực hiện một giao thức 'AnswersTheBigQuestion', nhưng tôi sẽ không thể mở rộng kiểu' không danh nghĩa' để áp dụng giao thức đó, đúng không? Vì bạn dường như không thể mở rộng chúng. –

+0

@TravisGriggs Tôi vừa thêm một ví dụ. Bạn có thể tạo một cấu trúc * có * một 'NiladicClosure', thay vì làm một cái gì đó * là * một' NiladicClosure'. –

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