Sử dụng loại không được khai báo trong loại Swift trong Swift, mặc dù loại là nội bộ và tồn tại trong cùng một mô-đun


173

Tôi có một loại trong mô-đun của mình:

import Cocoa

class ColoredDotView : NSView {
   ...
}

Nó được sử dụng trong một số lớp khác nhau mà không có vấn đề gì:

class EditSubjectPopoverController : NSObject {

    @IBOutlet internal var subjectColorDotView : ColoredDotView!
    ...
}

Nhưng vì một số lý do , khi tôi sử dụng nó trong một lớp cụ thể , tôi có lỗi biên dịch theo kiểu:

class EditTaskPopoverController : NSObject {

    @IBOutlet internal var lowPriorityDotView : ColoredDotView! // Error here
    @IBOutlet internal var medPriorityDotView : ColoredDotView! // And here...
    @IBOutlet internal var highPriorityDotView : ColoredDotView! // And here...
    ...
}

Lỗi biên dịch là:

EditTaskPopoverControll.swift: 15: 49: Sử dụng loại không được khai báo 'ColourDotView'

Mà tôi không hiểu. Đó là lỗi biên dịch đầu tiên trong tệp và các lỗi còn lại đều là triệu chứng của lần đầu tiên. Hơn nữa, không có tệp nào khác có lỗi biên dịch. Tôi không hiểu tại sao loại này không được khai báo, vì tệp nằm trong cùng một mô-đun:

nhập mô tả hình ảnh ở đây

Tôi đã thử làm sạch dự án, làm sạch thư mục xây dựng và khởi động lại Xcode, nhưng không có kết quả. Những sai lầm tiềm ẩn nào có thể gây ra undeclared typelỗi trình biên dịch trong Swift?


Tôi đã có rất nhiều trường hợp trong đó lỗi thực tế là một vài dòng (hoặc nhiều hơn) xuống và Xcode nhầm thẻ một cái gì đó vô hại với một thông báo lỗi. Xem bạn có thể loại bỏ lỗi đó bằng cách xóa phần còn lại của mã không, sau đó thêm lại từng chút một ...
Nate Cook

Cảm ơn Nate - thật không may, tôi xóa phần varkhai báo và chuyển xuống bản dựng. Sau đó, tôi thêm một trong các khai báo ở trên cùng và lỗi sẽ quay lại ngay lập tức: imgur.com/VUUBK2K
Craig Otis

Câu trả lời:


200

Đối với tôi, tôi đã gặp phải lỗi này khi mục tiêu thử nghiệm của tôi không có một số tệp nhanh chóng mà mục tiêu xây dựng ứng dụng của tôi có trong các nguồn biên dịch. Điều đó rất khó hiểu vì 'loại không khai báo' đã được sử dụng ở rất nhiều nơi khác mà không có vấn đề gì, và lỗi có vẻ mơ hồ. Vì vậy, giải pháp tất nhiên là thêm tệp chứa 'loại không khai báo' vào mục tiêu thử nghiệm.


2
Điều tương tự đối với tôi: vấn đề xảy ra khi một lớp được sử dụng bởi một lớp khác được bao gồm trong mục tiêu Kiểm tra, cũng không được bao gồm trong mục tiêu Kiểm tra! (╯ ° □ °) ┻ GoTo┻
Francesco Vadicamo

2
Bạn vừa giải quyết một vấn đề đã làm tôi bực mình trong nửa giờ. Tôi đã nhập một số lớp Swift trước đó vào một dự án hiện tại, nhưng rõ ràng là chưa thêm các lớp cũ hơn vào mục tiêu thử nghiệm. Nhưng tự động hoàn thành khiến tôi nghĩ rằng tất cả đều ổn ... cho đến khi tôi cố gắng xây dựng và chạy. Cái gì...! Cảm ơn bạn rất nhiều.
Jim Hillhouse

2
Điều này giải quyết vấn đề cho tôi là tốt. Tôi đã bấm vào một tập tin và tập tin-> sao chép một bản sao của nó. Bản sao mới đã được liệt kê nhưng không được bao gồm trong "nguồn biên dịch"
Ron Myschuk

1
Trong trường hợp của tôi, tôi đã chọn 3 mục tiêu (Kiểm tra dự án, UI & Đơn vị), tôi phải bỏ chọn các mục tiêu kiểm tra UI & Unit để giải quyết lỗi này
Frakcool

1
"Giải pháp tất nhiên ..." giả định rằng người đọc hiểu cách thêm mục tiêu thử nghiệm. Đối với chúng tôi chỉ mới bắt đầu với Xcode, đó không phải là khoảnh khắc "dĩ nhiên ...". Tôi nêu lên câu trả lời của @ edwin khi anh ấy hoàn thành câu trả lời của bạn.
Michael

181

Điều này đã được trả lời bởi @Craig Otis, nhưng vấn đề được gây ra khi các lớp trong câu hỏi không thuộc cùng một mục tiêu, thường là mục tiêu kiểm tra bị thiếu. Chỉ cần chắc chắn rằng các hộp kiểm sau đây được đánh dấu.


thành viên mục tiêu

Biên tập

Để xem các thành viên mục tiêu. Chọn tệp của bạn sau đó mở trình kiểm tra tệp (+ + 1) [ tùy chọn ] + [ lệnh ] + 1

miêu tả cụ thể


không chắc chắn nhưng khi tôi bỏ chọn mục tiêu "TEST" (trong trường hợp này là YAWA-WeatherTest). nó được xây dựng không có lỗi.
dellos

Bạn có thể vui lòng làm rõ vị trí trong XCode để đặt Tư cách thành viên mục tiêu này không? Tôi không nhớ là đã thấy nó trước đây. Cảm ơn.
Casey Perkins

2
Thật vậy, bỏ chọn mục tiêu thử nghiệm, vì đây là lý do tại sao chúng tôi "nhập khẩu @testable ..." trong các dự án thử nghiệm.
đã vẽ ..

Ảnh chụp màn hình rất hữu ích. Cảm ơn!
Michael

37

Phew, cuối cùng đã chẩn đoán điều này. Bằng cách nào đó , tệp Swift vi phạm có EditTaskPopoverController.swifthai giai đoạn xây dựng khác nhau.

Compile Sourcesđúng với tất cả các tệp Swift khác, nhưng cũng vì một lý do rất lạ, trong Copy Bundle Resourcesgiai đoạn này, cùng với tất cả các tài nguyên hình ảnh và XIB của tôi.

Tôi không biết làm thế nào nó đạt được điều đó, nhưng loại bỏ nó khỏi giai đoạn xây dựng thêm đã giải quyết vấn đề.


Tôi đã cùng một vấn đề nó bật ra, bởi vì tôi đã sử dụng github.com/kronenthaler/mod-pbxproj và nhanh chóng, tôi đã vô tình thêm nhanh chóng với các loại như PBXResourcesBuildPhase thay vì PBXSourcesBuildPhase trong mod-pbxproj
Richy

2
Người bạn đời! Cứu người, đã phá hỏng đầu tôi về điều này. Chúc mừng
SparkyRobinson

27

Trong menu XCode Sản phẩm-> Làm sạch và sau đó Sản phẩm-> Xây dựng làm việc cho tôi. Tôi gặp phải vấn đề này khi thêm ViewContoder mới vào dự án của mình trong Nhóm / Thư mục mới.


5
2 giờ và tôi chưa bao giờ nghĩ sẽ nhấp vào nút xây dựng để kết hợp khung sau khi cài đặt một nhóm ... Tôi sẽ rời đi ngay bây giờ ...
Cruceo

1
Lãng phí nhiều thời gian bằng cách thử các câu trả lời khác nhưng không bao giờ được làm sạch và xây dựng. Cảm ơn rất nhiều
Zeero0

Tôi đã gặp lỗi này khi chơi với SwiftUI trong Xcode 11.0 beta 5, trong khi làm theo hướng dẫn của Apple. Canvas đã hiển thị đúng các tệp khác, nhưng một tệp mới được thêm vào đã gây ra lỗi này, cho biết LandmarkRow_Previews là loại không được khai báo. Chỉ cần bản dựng Clean đã khắc phục vấn đề.
salo.dm

Câu trả lời này tương đương với hỗ trợ của Tech: "Bạn đã thử khởi động lại thiết bị của mình chưa?" Một mẹo hay :)
turingtested

14

Tôi cũng có chính xác vấn đề đấy. Một số tệp trong khung của tôi không thể truy cập được từ các lớp khác trong cùng một mô-đun.

Vì một số lý do, các tệp đã được thêm vào khung trong Xcode không phải là một phần của Nguồn biên dịch. Nếu tệp Swift của bạn không phải là một phần của các nguồn biên dịch, bạn cần thêm chúng bằng cách nhấn + và chọn chúng trong cửa sổ bật lên.

Ảnh chụp màn hình 1

Cũng đảm bảo rằng tệp là một phần của mục tiêu khung. (Nên chọn hộp nhỏ trong ảnh chụp màn hình bên dưới)

Ảnh chụp màn hình 2


12

Nguyên nhân đối với tôi là một tên hàm bắt đầu bằng các ký tự giống như một kiểu:

@IBOutlet weak var tableView: CustomTableView!

và trong quá trình triển khai, tôi đã có một chức năng bắt đầu với CustomTableView

func CustomTableView(tableView: CustomTableView, dataForRow row:  Int) -> NSData {...}

Cách khắc phục là thay đổi chữ ký hàm sao cho nó không bắt đầu bằng các ký tự giống như kiểu (CustomTableView), ví dụ:

func dataForRow(row: Int, tableView: CustomTableView) -> NSData {...}

Đây là một thông báo lỗi rất sai lệch cho nguyên nhân thực tế trong trường hợp của tôi.


1
Rất cám ơn đã đăng bản sửa lỗi này Andrew, đó là một sự trợ giúp tuyệt vời. Thông báo lỗi chắc chắn là sai lệch.
jjc99

7

Trong trường hợp bất kỳ ai gặp phải vấn đề tương tự nhưng bản sửa lỗi Nguồn biên dịch không giải quyết được vấn đề, việc khởi động lại Xcode có thể (nó hoạt động với tôi). Phiên bản Xcode của tôi là Version 6.1 (6A1052d).


Khởi động lại làm việc cho tôi, mặc dù lỗi xuất hiện trở lại sau khi xây dựng thành công, mà không có bất kỳ thay đổi mã nào nữa.
Uncommon

Khởi động lại Xcode khắc phục rất nhiều vấn đề, Apple thực sự nên làm gì đó với nó.
Forge

5

Trong ứng dụng của mình, tôi có đại biểu ứng dụng và các lớp khác cần được truy cập bằng các bài kiểm tra dưới dạng công khai. Như đã nêu ở đây , sau đó tôi nhập ứng dụng của mình vào các bài kiểm tra.

Khi tôi mới tạo hai lớp mới, mục tiêu thử nghiệm của chúng là cả phần chính và phần thử nghiệm. Loại bỏ họ khỏi tư cách thành viên của họ khỏi các bài kiểm tra đã giải quyết vấn đề.


5

Trong trường hợp của tôi, các nguồn biên dịch của TestTarget đã có các tệp từ Mục tiêu chính .

Tham chiếu :

Test Target chứa các tệp từ mục tiêu chính trong tab nguồn biên dịch

Tại sao điều này xảy ra?

  • Điều này xảy ra vì chúng tôi kiểm tra liên kết TestTarget trong khi tạo tệp

  • Hoặc tự kiểm tra tùy chọn này từ thanh tra.

    Tham chiếu :

    Tạo tệp - Mục tiêu kiểm tra được kiểm tra

Làm thế nào tôi giải quyết?

  • Tôi đã xóa các tệp của mục tiêu chính khỏi nguồn biên dịch của Target Target

5

? Đôi khi lỗi có thể rất ngớ ngẩn

Trước khi kiểm tra tất cả các giải pháp tại đây, hãy đảm bảo bạn đã nhập tất cả nội dung cơ bản

     import Foundation
     import UIKit

Có khả năng là khi bạn nhập một số tệp từ bên ngoài vào dự án của mình, có thể bỏ lỡ những điều cơ bản này như tôi đã trải nghiệm một lần.


điều đó đã xảy ra với tôi đối với CLLocationManagerDelegate và tất cả những gì tôi phải làm là nhập CoreLocation trên tệp khác này như tại sao tôi lại lãng phí 20 phút.
derek

4

Tôi đã thử nhiều giải pháp được cung cấp ở đây, nhưng cuối cùng đã xóa tệp và tạo lại nó, và Xcode đã bị nhại lại: /


Cái này cũng có tác dụng với tôi. Xóa tham chiếu, làm sạch, xây dựng, sau đó thêm tệp một lần nữa.
andnil

CẢM ƠN BẠN! Điều này khá kỳ quái. Chỉ làm việc cho tôi quá. Đã xóa mã cũ, sao chép vào tệp mới, thậm chí không phải xóa / xây dựng.
timman

4

Điều này cũng có thể xảy ra nếu bạn vô tình viết hoa tên tham số và gọi nó giống như đối tượng.

class func didRecieveData(BlockItems: [BlockItems])

3

Điều này có thể giúp một người nào đó.

Tôi đã tạo dự án thử nghiệm mới với Dữ liệu lõi được gọi là "CoreData". Một thời gian ngắn, tôi đã có "Sử dụng loại không khai báo" cho NSManagedObjectContext và các lớp Dữ liệu cốt lõi khác. Sau nhiều lần thử nhập, thêm vào các giai đoạn Xây dựng, v.v. Tôi đã xóa dự án và bắt đầu một dự án mới có tên là "TrialCoreData" và tất cả đều hoạt động tốt.

Không đặt tên (kiểm tra) Các dự án như tên của các Lớp học


3

Điều này cũng có thể xảy ra nếu bạn có một hàm có cùng tên với một loại đối tượng trong chữ ký của bạn. Ví dụ:

class func Player(playerObj: Player)

sẽ khiến trình biên dịch bị lẫn lộn (và đúng như vậy) vì trình biên dịch trước tiên sẽ xem cục bộ trong tệp trước khi xem các tệp khác. Vì vậy, nó nhìn vào "Người chơi" trong chữ ký và nghĩ rằng, đó không phải là một đối tượng trong phạm vi này, mà là một chức năng, vì vậy có gì đó không đúng.

Có lẽ đây là một lý do tốt tại sao tôi không nên viết hoa các chức năng của lớp. :)


3

Tôi đã nhận được thông báo lỗi này trong Xcode 8 trong khi tái cấu trúc mã vào một khung công tác, tôi nhận ra rằng tôi đã quên khai báo lớp trong khung như public


2

Có thể bạn đã thêm lớp với một số "FirstNameClass" và sau đó đổi tên thủ công thành "ColourDotView". Cố gắng sao chép nội dung của lớp "ColoringDotView" vào clipboard, xóa "ColourDotView" khỏi dự án và thêm agin.

Id này khắc phục vấn đề tương tự từ tôi.


2

Trong trường hợp của tôi là một sai lầm của tôi. Tôi đã thêm một tệp mới là "OS X> Nguồn> Lớp ca cao", thay vì "iOS> Nguồn> Lớp cảm ứng ca cao".


2

Trong trường hợp của tôi, điều này được gây ra bởi một tên lớp con được sử dụng trong dòng tiếp theo dưới dạng tên biến với một loại khác:

var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlow: PipGlowSprite = PipGlowSprite()

Lưu ý rằng trong dòng 1, pipGlow là tên của lớp con (của SKShapeNode), nhưng trong dòng hai, tôi đã sử dụng pipGlow làm tên biến. Đây không chỉ là phong cách mã hóa xấu, mà rõ ràng là hoàn toàn không có! Khi tôi thay đổi dòng thứ hai thành:

var binGlow: pipGlow = pipGlow(style: "Bin")
var pipGlowSprite: PipGlowSprite = PipGlowSprite()

Tôi không còn nhận được lỗi. Tôi hi vọng điêu nay se giup được ai đo!


2

Khi kiểm tra mã Swift thuộc về ứng dụng, trước tiên hãy đảm bảo mục tiêu thử nghiệm đang xây dựng ứng dụng làm phụ thuộc. Sau đó, trong thử nghiệm của bạn, nhập ứng dụng dưới dạng một mô-đun. Ví dụ:

@testable import MyApplication

Điều này sẽ làm cho các đối tượng Swift là một phần của ứng dụng có sẵn để thử nghiệm.


2

Trong trường hợp của tôi, đó là do Mã hóa văn bản của tập tin nhanh chóng gây ra. Một tệp hiển thị 'Không mã hóa rõ ràng' và sau khi chuyển đổi nó thành 'UTF-8', vấn đề đã được giải quyết.

Và lý do tại sao mã hóa văn bản của tệp không rõ ràng là tôi đã sao chép tất cả mã từ tệp nhanh khác.

Không có ảnh chụp màn hình mã hóa rõ ràng

nhập mô tả hình ảnh ở đây

Ảnh chụp màn hình UTF-8

nhập mô tả hình ảnh ở đây


2

Làm sạch dự án đã giải quyết vấn đề của tôi.

Các bước: Sản phẩm -> Làm sạch (hoặc Shift + Cmd + K)


1

Trong trường hợp của tôi, tôi muốn thêm một phương thức với một đối tượng swift tùy chỉnh làm tham số kiểu và tên tôi đặt cho biến trong tham số này hoàn toàn giống với tên lớp đối tượng tùy chỉnh

Các vấn đề là như thế này:

func moveBlob(**blob** : blob){
    ...code
}

Phần trong các ký tự in đậm đã gây ra lỗi của loại không được khai báo


1

như những người khác đã đề cập tốt và trong chủ đề này

sử dụng các tập tin swift không cần thiết trong "sao chép tài nguyên gói" chụp màn hình để giúp đỡ


1

Giống như những người khác, đó là một số mã không liên quan đã gây ra @testable cố.

Trong mục tiêu thử nghiệm của tôi có tệp tiêu đề Objective-C có

@import ModuleUnderTest;

Tôi đã xóa dòng này (vì việc nhập thực sự không cần thiết) và thật kỳ diệu @testablebắt đầu hoạt động trở lại.

Tôi chỉ có thể theo dõi điều này nhưng loại bỏ mọi thứ khỏi dự án của tôi và thêm lại từng chút một cho đến khi thất bại. Cuối cùng, tôi tìm thấy dòng mã vấn đề.



1

Trong trường hợp ai đó phạm sai lầm ngớ ngẩn tương tự tôi đã làm ...

Tôi đã gặp lỗi này vì khi đổi tên tệp nguồn của mình, tôi đã vô tình xóa. tên tệp và vì vậy trình biên dịch đã xử lý tệp dưới dạng tệp văn bản thuần túy và không phải là nguồn để biên dịch.

Vì vậy, tôi có nghĩa là đổi tên tập tin thành MyProtocol.swift nhưng vô tình đặt tên nó MyProtocolswift

Đó là một sai lầm đơn giản, nhưng rõ ràng đây không phải là điều đang xảy ra.


1

Không thêm chính xác nhập khẩu cũng có thể là một thiếu sót rõ ràng. Đối với tôi, tôi chỉ đơn giản là bỏ qua để nhập PriorityUIKit.


1

Tình huống của tôi là tôi kéo một tệp mới XXView.swift vào dự án. Và khai báo một kiểu View là XXView thì lỗi "sử dụng kiểu không khai báo ....".

Tôi chỉ cố gắng thêm XXView.swift của mình vào mục tiêu thử nghiệm mà nó đã giải quyết được lỗi. Nhưng tôi không muốn Lớp UI của mình tham gia vào mục tiêu thử nghiệm.

Cuối cùng, tôi đã tìm thấy ViewContoder của mình trong mục tiêu thử nghiệm không nên xảy ra. (Tôi nghĩ bởi vì tôi tạo VC bằng một xctemplate do đó, nó tự động được bao gồm trong mục tiêu thử nghiệm)

Tôi loại bỏ bộ điều khiển xem khỏi mục tiêu thử nghiệm, và sau đó XXView của tôi bây giờ không cần thêm vào mục tiêu thử nghiệm.

Kết luận: đảm bảo tất cả các tệp liên quan của bạn cũng sẽ bỏ chọn mục tiêu kiểm tra.


1

Sau khi dành một giờ cho lỗi này, tôi thấy rằng tệp mô-đun được sao chép. xóa tệp bổ sung và dịch chuyển + cmd + k để xóa và lỗi đã biến mất.


Đây có thể là một câu hỏi ngu ngốc nhưng bạn có thể giải thích thêm về điều đó? Điều này có xảy ra với các tệp swift trùng lặp không, hoặc các nhóm trùng lặp, v.v.? Nó hoạt động nhưng tôi muốn biết nhiều hơn về lý do tại sao nó hoạt động hơn là chỉ chấp nhận rằng nó hoạt động. Cảm ơn giải pháp bằng cách này!
Cody Vollrath

1

Trong trường hợp của tôi, vấn đề là với một cái mới classkhông được công nhận. Tôi đã giải quyết vấn đề bằng cách xóa lớp và thêm lại nhưng lần này kiểm tra Watch App Extensiontùy chọn khi tạo lớp mới.

nhập mô tả hình ảnh ở đây

Xin lưu ý rằng tôi có Tiện ích mở rộng ứng dụng đồng hồ trong Ứng dụng của mình.


Cảm ơn và trong trường hợp của tôi cũng chỉ cần thêm tập tin cho chính xác Target.
coletrain
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.