2016-01-01 19 views
9

Tôi đang viết một ứng dụng iOS trong Swift và tôi đang cố gắng tìm hiểu cách tổ chức dự án thành các mô-đun riêng biệt. Tôi đang sử dụng một kiến ​​trúc MVVM, và tôi muốn làm cho các thành phần Model, ViewModel và View tách các mô-đun Swift riêng biệt mà chỉ làm cho các tập con của chúng có thể truy cập được vào các mô-đun nhập chúng. Các tệp trong Chế độ xem sẽ nhập ViewModel và các tệp trong ViewModel sẽ nhập Mô hình. Làm thế nào tôi có thể thực hiện điều này? Lưu ý rằng tôi không cố tạo các thư viện mà nhiều ứng dụng có thể chia sẻ. Tôi chỉ cố gắng thực thi việc tách các thành phần bằng cách sử dụng các mô-đun.Chia các thành phần của ứng dụng Swift thành các mô-đun Swift

EDIT: Có thể câu hỏi là, "Tôi nên sử dụng cơ chế nào để tạo mô-đun ngoài mô-đun đi kèm với dự án ứng dụng iOS ban đầu?"

Một trong những câu trả lời trong "Cách bạn sử dụng Không gian tên trong Swift?" https://stackoverflow.com/a/24032860/215400 cho biết, "các lớp (v.v.) được ngầm hóa bởi mô-đun (đích Xcode) mà chúng đang ở." Từ đó, người ta có thể kết luận rằng các mục tiêu tương ứng với các mô-đun và câu trả lời là tạo ra các mục tiêu riêng biệt trong một dự án Xcode, nhưng tôi đã thử trước đó và tskulbru đang nói rằng tôi cần nhiều dự án Xcode.

Về nhiều dự án Xcode, tùy chọn Tệp> New> Project> iOS Framework & Library> Cocoa Touch Framework không đúng vì nó được sử dụng cho những thứ sử dụng UIKit và hai mô-đun tôi muốn tạo không nên phụ thuộc vào UIKit. Tùy chọn "Khung & Thư viện" khác, thư viện tĩnh Cocoa Touch, không phải là một tùy chọn với Swift.

Bài đăng StackOverflow khác được đề cập bằng cách sử dụng Pod riêng tư. Sau khi dành một giờ làm việc trên đó, tôi kết luận rằng đó không phải là giải pháp đúng vì tôi không cần phải chỉnh sửa các mô-đun này trong các không gian làm việc khác nhau.

+0

Bản sao có thể có của [Làm thế nào để bạn sử dụng Không gian tên trong Swift?] (Http://stackoverflow.com/questions/24002821/how-do-you-use-namespaces-in-swift) – tskulbru

+0

Tại sao không sử dụng 'riêng tư 'vòng loại để thực thi đóng gói? –

+1

@ Marc - Cảm ơn, nhưng làm cho mọi thứ riêng tư đối với các tệp mà chúng được xác định không phải là thứ tôi muốn. Công khai so với truy cập nội bộ mà Mô-đun cung cấp (https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html) chính xác là những gì tôi muốn. –

Trả lời

5

Điều này là không thể nếu không tạo các dự án riêng biệt cho các mô-đun bạn muốn tạo. Điều này là do cách Swift xử lý không gian tên.

Eonil đã trả lời điều này hơn tôi: https://stackoverflow.com/a/24032860/215400 (Sao chép dưới đây)

Giải đáp của SevenTenEleven trong Apple dev forum:

Namespaces không mỗi tập tin; chúng theo mục tiêu (dựa trên cài đặt xây dựng "Tên mô-đun sản phẩm" ). Vì vậy, bạn muốn kết thúc với một cái gì đó như thế này:

import FrameworkA 
import FrameworkB 

FrameworkA.foo() 

Tất cả các tờ khai Swift được coi là một phần của một số mô-đun, vì vậy ngay cả khi bạn nói "NSLog" (vâng, nó vẫn tồn tại) bạn' tìm lại những gì Swift nghĩ là "Foundation.NSLog".

Cũng Chris Lattner tweeted about namespacing.

Không gian tên tiềm ẩn nhanh chóng, tất cả các lớp (v.v) được ẩn hoàn toàn do mô-đun (mục tiêu Xcode) sắp xếp.không có tiền tố lớp cần

+1

Nếu bạn sao chép các phần chính từ câu trả lời khác, vui lòng thêm liên kết vào phần gốc để phân bổ phù hợp: http://stackoverflow.com/a/24032860/1187415. –

+0

Tuyệt đối, tôi đã chỉnh sửa câu trả lời của mình. – tskulbru

+0

Heh, tôi thực sự nghĩ rằng câu trả lời của bạn là gần gũi hơn với những gì tôi đang tìm kiếm, tskulbru. Nếu tôi cần tạo các dự án riêng biệt, tôi nên làm thế nào? Tôi có nên đi với tùy chọn "Cocoa Touch Framework" mặc dù thực tế là tôi không cần UIKit? Có vẻ như "Cocoa Touch Static Library" sẽ có ý nghĩa hơn, nhưng nó không phải là một lựa chọn với Swift. Như đã đề cập ở trên, tôi bắt đầu đi xuống con đường của một Pod tư nhân, nhưng điều đó không có vẻ quá tốt. –

1

Theo quan điểm của tôi nếu bạn muốn để đóng gói các thành phần của bạn, có lẽ bạn có hai giải pháp:

  • Khung
  • cocoapods nội

Cả hai giải pháp này sẽ cung cấp cho bạn đóng gói đầy đủ các mô-đun, nơi bạn có thể xác định API sẽ có sẵn trong dự án thông qua public từ khóa. Tất cả những thứ khác sẽ không hiển thị trong dự án cốt lõi của bạn.

Quản lý dự án của bạn sẽ mất nhiều thời gian hơn, nhưng nếu bạn viết điều này bằng nguyên tắc SOLID, có thể bạn sẽ nhận được mã tái sử dụng nhiều hơn và các khung đó có thể được nhập vào dự án khác chỉ sử dụng định nghĩa import.

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