Không thể sử dụng các lớp Swift bên trong Objective-C


260

Tôi cố gắng tích hợp Swiftmã trong ứng dụng của mình. Ứng dụng của tôi được viết Objective-Cvà tôi đã thêm một Swiftlớp. Tôi đã làm mọi thứ được mô tả ở đây . Nhưng vấn đề của tôi là Xcodekhông tạo được -Swift.htệp, chỉ có các tiêu đề bắc cầu. Vì vậy, tôi đã tạo ra nó, nhưng nó thực sự trống rỗng. Tôi có thể sử dụng tất cả các lớp ObjC của mình trong Swift, nhưng tôi không thể làm điều đó ngược lại. Tôi đã đánh dấu lớp học nhanh của mình @objcnhưng nó không giúp được gì. Tôi có thể làm gì bây giờ?

EDIT: Apple nói: "Khi bạn nhập mã Swift vào Objective-C, bạn dựa vào một Xcode-generatedtệp tiêu đề để hiển thị các tệp đó thành Objective-C. [...] Tên của tiêu đề này là tên mô-đun sản phẩm của bạn, sau đó thêm vào -Swift.h xông. "

Bây giờ khi tôi muốn nhập Tệp đó, nó sẽ báo lỗi:

    //MainMenu.m

    #import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found

    @implementation MainMenu

Đây là tập tin FBManager.swift của tôi:

@objc class FBManager: NSObject {

    var descr = "FBManager class"

    init() {
        super.init()
    }

    func desc(){
        println(descr)
    }

    func getSharedGameState() -> GameState{
        return GameState.sharedGameState() //OK! GameState is written in Objective-C and no error here
    }
}

27
YourProjectName-Swift.hphải là một tệp tiêu đề kỳ diệu mà Xcode tự động tạo cho bạn trong quá trình biên dịch (bạn thực sự sẽ không thấy nó trong trình duyệt dự án). Hãy thử xóa cái bạn đã tạo và thêm #import YourProjectName-Swift.hvào các tệp mà bạn muốn sử dụng các lớp Swift.
Greg

3
Là ứng dụng của bạn mà bạn đang xây dựng được gọi là myProjectModule? Các -Swift.htập tin nên bắt đầu với tên ứng dụng của bạn. Bạn có một tập tin kết thúc bằng -Bridging-Header.h? Bạn nên. Nếu vậy, phần đầu tiên của tệp đó là tên dự án của bạn. Kết hợp phần đầu tiên của tên tệp -Swift.hđó và đó là những gì bạn nên đưa vào.
vacawama

4
Tôi đã làm việc này thành công trong dự án của mình và chưa có tệp thực sự nào kết thúc -Swift.hđược tìm thấy trên máy Mac của tôi và tôi có thể đưa nó vào. Vì vậy, không được treo lên tìm kiếm một tập tin như vậy. Chỉ cần chắc chắn rằng bạn đang đặt tên chính xác.
vacawama

2
@vacawama Lưu ý rằng bạn có thể xem nội dung sau khi bạn thêm câu lệnh nhập vào tệp Objective-C bằng cách Nhấp chuột vào lệnh nhập như thể bạn đang truy cập bất kỳ tệp tiêu đề nào khác.
Kendall Helmstetter Gelner

4
Tôi phải sử dụng#import <MyProjectName/MyProjectName-Swift.h>
Oliver Pearmain

Câu trả lời:


516

Tôi đã dành khoảng 4 giờ để cố gắng kích hoạt Swifttrong Xcodedự án dựa trên Objective-C của mình. myproject-Swift.hTập tin của tôi đã được tạo thành công, nhưng tôi Xcodekhông thấy Swift-classes. Vì vậy, tôi quyết định tạo một Xcodedự án dựa trên Objc mới và cuối cùng, tôi đã tìm thấy câu trả lời đúng! Hy vọng bài viết này sẽ giúp được ai đó :-)

Từng bước tích hợp Swift cho dự án dựa trên Xcode Objc:

  1. Tạo *.swifttệp mới (trong Xcode) hoặc thêm nó bằng cách sử dụng Finder.
  2. Tạo một Objective-C bridging headerkhi Xcode hỏi bạn về điều đó.
  3. Triển khai lớp Swift của bạn:

    import Foundation
    
    // use @objc or @objcMembers annotation if necessary
    class Foo {
        //..
    }
    
  4. Mở Build Settings và kiểm tra các thông số sau:

    • Mô-đun xác định: YES

      Sao chép và dán tên tham số trong thanh tìm kiếm

    • Tên mô-đun sản phẩm: myproject

      Đảm bảo rằng Tên mô-đun sản phẩm của bạn không chứa bất kỳ ký tự đặc biệt nào

    • Cài đặt tiêu đề tương thích Objective-C: YES

      Khi bạn đã thêm *.swifttệp vào dự án, thuộc tính này sẽ xuất hiện trong Cài đặt bản dựng

    • Tiêu đề giao diện được tạo ra Objective-C: myproject-Swift.h

      Tiêu đề này được tạo tự động bởi Xcode

    • Tiêu đề cầu nối khách quan-C: $(SRCROOT)/myproject-Bridging-Header.h
  5. Nhập tiêu đề giao diện Swift trong tệp * .m của bạn.

    #import "myproject-Swift.h"

    Đừng chú ý đến lỗi và cảnh báo.

  6. Làm sạch và xây dựng lại dự án Xcode của bạn.
  7. Lợi nhuận!

2
Có ai thấy đề cập đến cấu hình cần thiết (ít nhất là đối với tôi) trong tài liệu tại: developer.apple.com/l Library / prelelease / ios / document / Swift / bia trong bước 4 ở trên không? Nếu là tôi đã bỏ lỡ nó. Cảm ơn @sig.
Morkrom

2
Vấn đề của tôi đơn giản hơn nhiều - tôi không thể tìm thấy tập tin "myproject-Swift.h"nên dường như nó không hoạt động. Rõ ràng, tập tin này không thể nhìn thấy trong trình điều hướng dự án.
Asaf

6
@Asaf Trên thực tế, có, tệp này được tự động tạo bởi Xcode và định vị trong đường dẫn xây dựng dự án của bạn. Vì vậy, bạn có thể tìm thấy tệp này theo cách thủ công trong Finder / Console hoặc mở trực tiếp trong Xcode bằng cách sử dụng Cmd + LeftClick trên #import "myproject-Swift.h".
sig

1
Đối với tôi # 5 là đủ để khắc phục vấn đề !!
skywinder

12
Với 4 giờ đó, bạn đã tiết kiệm được hàng trăm giờ của chúng tôi, Cảm ơn rất nhiều :) Đã lưu trong mục ưa thích của tôi;)
Abo3atef 13/03/2016

65

Đừng tự tạo tập tin tiêu đề. Xóa cái bạn đã tạo.

Đảm bảo rằng các lớp Swift của bạn được gắn thẻ @objchoặc kế thừa từ một lớp xuất phát (trực tiếp hoặc gián tiếp) từ đó NSObject.

Xcode sẽ không tạo tệp nếu bạn có bất kỳ lỗi biên dịch nào trong dự án của bạn - hãy đảm bảo rằng dự án của bạn được xây dựng sạch sẽ.


8
có thể xây dựng là chìa khóa cho tôi. Không thể xây dựng vì nó không thể tìm thấy tệp -swift.h của tôi, nhưng nó không thể tìm thấy tệp -swift.h của tôi vì nó không thể xây dựng: /
anders

13
@anders trong khi bị mắc kẹt trong chu trình đó, bạn có thể sử dụng find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -uđể xem liệu tệp có được tạo với một tên không mong muốn giống như nó dành cho tôi không. :)
CodeReaper

38

Cho phép Xcode thực hiện công việc của nó, không thêm / tạo tiêu đề Swift theo cách thủ công. Chỉ cần thêm @objc trước lớp Swift cũ của bạn.

@objc class YourSwiftClassName: UIViewController

Trong cài đặt dự án của bạn, tìm kiếm các cờ bên dưới và thay đổi thành CÓ (Cả Dự án và Mục tiêu)

Defines Module : YES
Always Embed Swift Standard Libraries : YES
Install Objective-C Compatibility Header : YES

Sau đó làm sạch dự án và xây dựng một lần, sau khi xây dựng thành công (có lẽ nên) nhập tệp tiêu đề bên dưới vào tệp .m của lớp object-c của bạn

#import "YourProjectName-Swift.h" 

Bạo lực!


1
Cảm ơn, điều này rất đơn giản và giải quyết vấn đề của tôi.
Felipe

Tôi thấy không có tùy chọn nào trong Cài đặt bản dựng (Xcode 7.3.1). Tôi nên làm gì?
iosdude

1
^ Phải chuyển từ Basicsang Allthanh trên cùng.
iosdude

1
Embedded Content Contains Swiftđã được thay đổi thành Always Embed Swift Standard Librariesvới Xcode 8: stackoverflow.com/questions/38792650/iêu
William Grand

@WilliamGrand Cảm ơn bạn đã gợi ý, cập nhật câu trả lời.
Bharat Modi

28

Cũng có thể hữu ích cho những bạn có mục tiêu Framework :

Câu lệnh nhập của tệp tiêu đề được tạo tự động trông hơi khác so với mục tiêu ứng dụng. Ngoài những điều khác được đề cập trong các câu trả lời khác sử dụng

#import <ProductName/ProductModuleName-Swift.h>

thay vì

#import "ProductModuleName-Swift.h"

theo tài liệu Táo về Mix & Match cho các mục tiêu khung.


1
@dineshar camera Vui mừng tôi có thể giúp! :)
Jeehut

Còn mục tiêu bó thì sao?
Iulian Onofrei

14

Hãy chắc chắn rằng dự án của bạn xác định một mô-đun và bạn đã đặt tên cho mô-đun. Sau đó, xây dựng lại và Xcode sẽ tạo -Swift.htệp tiêu đề và bạn sẽ có thể nhập.

Bạn có thể đặt định nghĩa mô-đun và tên mô-đun trong cài đặt dự án của bạn.


14

Chi tiết: Dự án Objective-C với mã Swift 3 trong Xcode 8.1

Nhiệm vụ:

  1. Sử dụng enum nhanh chóng trong lớp object-c
  2. Sử dụng en-c enum trong lớp swift

MẪU ĐẦY ĐỦ

1. Lớp Objective-C sử dụng Swift enum

ObjcClass.h

#import <Foundation/Foundation.h>

typedef NS_ENUM(NSInteger, ObjcEnum) {
    ObjcEnumValue1,
    ObjcEnumValue2,
    ObjcEnumValue3
};

@interface ObjcClass : NSObject

+ (void) PrintEnumValues;

@end

ObjcClass.m

#import "ObjcClass.h"
#import "SwiftCode.h"

@implementation ObjcClass

+ (void) PrintEnumValues {
    [self PrintEnumValue:SwiftEnumValue1];
    [self PrintEnumValue:SwiftEnumValue2];
    [self PrintEnumValue:SwiftEnumValue3];
}

+ (void) PrintEnumValue:(SwiftEnum) value {
    switch (value) {
        case SwiftEnumValue1:
            NSLog(@"-- SwiftEnum: SwiftEnumValue1");
            break;
            
        case SwiftEnumValue2:
        case SwiftEnumValue3:
            NSLog(@"-- SwiftEnum: long value = %ld", (long)value);
            break;
    }
}

@end

Phát hiện mã Swift trong mã Objective-C

Trong mẫu của tôi, tôi sử dụng SwiftCode.h để phát hiện mã Swift trong Objective-C. Tệp này tự động tạo (Tôi không tạo bản sao vật lý của tệp tiêu đề này trong dự án) và bạn chỉ có thể đặt tên của tệp này:

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

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

Nếu trình biên dịch không thể tìm thấy tệp tiêu đề Swift của bạn, hãy thử biên dịch dự án.

2. Lớp Swift sử dụng enive Objective-C

import Foundation

@objc
enum SwiftEnum: Int {
    case Value1, Value2, Value3
}

@objc
class SwiftClass: NSObject {
    
    class func PrintEnumValues() {
        PrintEnumValue(.Value1)
        PrintEnumValue(.Value2)
        PrintEnumValue(.Value3)
    }
    
    class func PrintEnumValue(value: ObjcEnum) {
        switch value {
        case .Value1, .Value2:
            NSLog("-- ObjcEnum: int value = \(value.rawValue)")
            
        case .Value3:
            NSLog("-- ObjcEnum: Value3")
            break
        }
        
    }
}

Phát hiện mã Objective-C trong mã Swift

Bạn cần tạo tập tin tiêu đề bắc cầu. Khi bạn thêm tệp Swift trong dự án Objective-C hoặc tệp Objective-C trong dự án nhanh, Xcode sẽ đề nghị bạn tạo tiêu đề bắc cầu.

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

Bạn có thể thay đổi tên tệp tiêu đề bắc cầu tại đây:

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

Cầu nối-Header.h

#import "ObjcClass.h"

Sử dụng

#import "SwiftCode.h"
...
[ObjcClass PrintEnumValues];
[SwiftClass PrintEnumValues];
[SwiftClass PrintEnumValue:ObjcEnumValue3];

Kết quả

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


MẪU THÊM

Các bước tích hợp đầy đủ Objective-c và Swift được mô tả ở trên . Bây giờ tôi sẽ viết một số ví dụ mã khác.

3. Gọi lớp Swift từ mã Objective-c

Lớp học nhanh

import Foundation

@objc
class SwiftClass:NSObject {
    
    private var _stringValue: String
    var stringValue: String {
        get {
            print("SwiftClass get stringValue")
            return _stringValue
        }
        set {
            print("SwiftClass set stringValue = \(newValue)")
            _stringValue = newValue
        }
    }
    
    init (stringValue: String) {
        print("SwiftClass init(String)")
        _stringValue = stringValue
    }
    
    func printValue() {
        print("SwiftClass printValue()")
        print("stringValue = \(_stringValue)")
    }
    
}

Mã Objective-C (mã gọi)

SwiftClass *obj = [[SwiftClass alloc] initWithStringValue: @"Hello World!"];
[obj printValue];
NSString * str = obj.stringValue;
obj.stringValue = @"HeLLo wOrLd!!!";

Kết quả

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

4. Gọi lớp Objective-c từ mã Swift

Lớp Objective-C (ObjcClass.h)

#import <Foundation/Foundation.h>

@interface ObjcClass : NSObject
@property NSString* stringValue;
- (instancetype) initWithStringValue:(NSString*)stringValue;
- (void) printValue;
@end

ObjcClass.m

#import "ObjcClass.h"

@interface ObjcClass()

@property NSString* strValue;

@end

@implementation ObjcClass

- (instancetype) initWithStringValue:(NSString*)stringValue {
    NSLog(@"ObjcClass initWithStringValue");
    _strValue = stringValue;
    return self;
}

- (void) printValue {
    NSLog(@"ObjcClass printValue");
    NSLog(@"stringValue = %@", _strValue);
}

- (NSString*) stringValue {
    NSLog(@"ObjcClass get stringValue");
    return _strValue;
}

- (void) setStringValue:(NSString*)newValue {
    NSLog(@"ObjcClass set stringValue = %@", newValue);
    _strValue = newValue;
}

@end

Mã Swift (mã gọi)

if let obj = ObjcClass(stringValue:  "Hello World!") {
    obj.printValue()
    let str = obj.stringValue;
    obj.stringValue = "HeLLo wOrLd!!!";
}

Kết quả

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

5. Sử dụng tiện ích mở rộng Swift trong mã Objective-c

Gia hạn Swift

extension UIView {
    static func swiftExtensionFunc() {
        NSLog("UIView swiftExtensionFunc")
    }
}

Mã Objective-C (mã gọi)

[UIView swiftExtensionFunc];

6. Sử dụng phần mở rộng Objective-c trong mã swift

Phần mở rộng Objective-C (UIViewExtension.h)

#import <UIKit/UIKit.h>

@interface UIView (ObjcAdditions)
+ (void)objcExtensionFunc;
@end

UIViewExtension.m

@implementation UIView (ObjcAdditions)
+ (void)objcExtensionFunc {
    NSLog(@"UIView objcExtensionFunc");
}
@end

Mã Swift (mã gọi)

UIView.objcExtensionFunc()

Những mẫu này thực sự hữu ích, cảm ơn bạn! Và đối với Swift 4+, chúng ta cần thêm @objcMembersvào trước lớp. Bởi vì @objcsuy luận đã được giảm trong Swift 4 cho mục đích tối ưu hóa. Chẳng hạn, một thuộc tính trong lớp có nguồn gốc NSObject, sẽ không còn suy ra @objc theo mặc định (như đã làm trong Swift 3). Tôi đã nhận được thông tin này từ câu trả lời này .
Hustlion

11

Tôi đã có cùng một vấn đề và hóa ra các ký hiệu đặc biệt trong tên mô-đun được thay thế bằng xcode (trong trường hợp của tôi, dấu gạch ngang cuối cùng là dấu gạch dưới). Trong cài đặt dự án, kiểm tra "tên mô-đun" để tìm tên mô-đun cho dự án của bạn. Sau đó, sử dụng ModuleName-Swift.hhoặc đổi tên mô-đun trong cài đặt.


10
Tôi là một thằng ngu. Tôi đã thêm tên Lớp và sau đó thêm "-Swift". Hóa ra đó là tên "mô-đun". +1 để khiến tôi nhận ra điều này.
HotFudgeSunday 17/2/2015

2
Một kẻ ngốc khác ở đây đã nghĩ rằng đó là tên lớp!
Charlie Martin

9

Tệp được tạo tự động (nói về Xcode 6.3.2 tại đây). Nhưng bạn sẽ không thấy nó, vì nó nằm trong thư mục Dữ liệu đã tạo của bạn. Sau khi đánh dấu lớp swift của bạn bằng @objc, biên dịch, sau đó tìm kiếm Swift.htrong thư mục Dữ liệu đã tạo của bạn. Bạn nên tìm tiêu đề Swift ở đó.

Tôi đã có một vấn đề, đó là Xcode đã đổi tên tôi my-Project-Swift.hthành my_Project-Swift.hXcode không giống như "." "-"các biểu tượng, v.v. Với phương thức trên, bạn có thể tìm tên tệp và nhập nó vào lớp Objective-C.


1
Điều này cũng giải quyết vấn đề của tôi. Trong tệp .m của tôi, tôi nhập tệp như thế này #import "my_project-Swift.h" và tên dự án thực tế của tôi làmy-project
Bhavin_m

Chú ý- không chỉ "." "-" cũng có khoảng trắng :(
user1105951

8

Chỉ cần bao gồm #import "myProject-Swift.h" trong tệp .m hoặc .h

PS Bạn sẽ không tìm thấy "myProject-Swift.h" trong trình kiểm tra tệp mà nó bị ẩn. Nhưng nó được tạo ra bởi ứng dụng tự động.


Cảm ơn cho những người đứng đầu, bạn đời.
Felipe

Câu trả lời này đã giúp tôi và cứu ngày của tôi. Điều quan trọng hơn là Xcode đang tự động tạo và đó là tệp HIDDEN. Tôi đã tự tạo "myProject-Swift.h" và nó không hoạt động.
C0mrade

5

@sig trả lời là một trong những câu hỏi hay nhất, tuy nhiên, nó không hoạt động với tôi với dự án cũ (không phải mới!), tôi cần một số sửa đổi. Sau rất nhiều biến thể, tôi đã tìm thấy công thức cho mình (sử dụng XCode 7.2):

  1. Tên mô-đun sản phẩm: $ (PRODUCT_NAME: c99extidentifier)
  2. Mô-đun xác định: KHÔNG
  3. Nội dung nhúng chứa Swift: KHÔNG
  4. Cài đặt tiêu đề tương thích Objective-C: CÓ
  5. Tiêu đề cầu nối khách quan-C: ProjectName-Bridging-Header.h

Điểm cuối cùng (5) là rất quan trọng. Tôi chỉ đặt nó trên phần thứ hai (trường Mục tiêu), trường Dự án nên để trống: nhập mô tả hình ảnh ở đâyNếu không, nó không tạo tệp "Project-Swift.h" đúng cho tôi (nó không bao gồm các phương thức nhanh).


1
cũng là một liên kết hữu ích: ericasadun.com/2014/08/21/ Lời
Darius Miliauskas

1
Cảm ơn Cảm ơn Cảm ơn rất nhiều @DariusMiliauskas chỉ làm cho nó hoạt động với liên kết của bạn
a4arpan

1
@DariusMiliauskasthanks rất nhiều! 5 điểm cũng giải quyết được vấn đề cho tôi trong dự án Xcode cũ
tatiana_c

Define Modulesnên là No??
Sunil Chauhan


5

Có hai điều kiện,

  • Sử dụng tệp swift của bạn trong tệp c mục tiêu.
  • Sử dụng tệp c mục tiêu của bạn trong tệp nhanh chóng.

Vì vậy, với mục đích đó, bạn phải làm theo các bước sau:

  • Thêm tệp nhanh chóng của bạn trong một dự án object-c hoặc ngược lại.
  • Tạo tập tin tiêu đề (.h).
  • Chuyển đến Cài đặt bản dựng và thực hiện các bước bên dưới với tìm kiếm,

    1. tìm kiếm văn bản này "cầu nối" và đặt đường dẫn của tệp tiêu đề của bạn.
    2. "Xác định mô-đun": CÓ.
    3. "Luôn nhúng thư viện chuẩn Swift": CÓ.
    4. "Cài đặt tiêu đề tương thích Objective-C": CÓ.

Sau đó, làm sạch và xây dựng lại dự án của bạn.

Sử dụng tệp swift của bạn trong tệp c mục tiêu.

Trong trường hợp đó, Đầu tiên hãy viết "@objc" trước lớp của bạn trong tệp swift.

Sau đó, trong tệp mục tiêu c của bạn, hãy viết này,

  #import "YourProjectName-Swift.h"

Sử dụng tệp c mục tiêu của bạn trong tệp nhanh chóng.

Trong trường hợp đó, trong tệp tiêu đề của bạn, hãy viết này,

  #import "YourObjective-c_FileName.h"

Tôi hy vọng điều này sẽ giúp bạn.


4

Dành cho Swift 5:

  1. Thêm @objctừ khóa vào lớp và phương thức của bạn
  2. Thêm publictừ khóa vào lớp và phương thức của bạn
  3. Hãy để lớp của bạn kế thừa từ NSObject
  4. Xây dựng dự án
  5. Đặt #import "MyProject-Swift.h"trong tệp Objective-C của bạn

    @objc
    public class MyClass: NSObject {
    
        @objc
        public func myMethod() {
    
        }
    }

"Thêm từ khóa @objc vào lớp và phương thức của bạn" - tương tự cho Swift 4
Krzysztof Skrzynecki

3

Trong trường hợp của tôi, ngoài các bước sau:

  1. Tên mô-đun sản phẩm: myproject
  2. Mô-đun xác định: CÓ
  3. Nội dung nhúng chứa Swift: CÓ
  4. Cài đặt tiêu đề tương thích Objective-C: CÓ
  5. Tiêu đề cầu nối khách quan-C: $ (SRCROOT) /Source/SwiftBridging.h

Tôi cần phải đặt lớp ở chế độ công khai để tạo tệp ProductName-Swift.h :

import UIKit

   @objc public class TestSwift: NSObject {
       func sayHello() {
          print("Hi there!")
       }
   }

2

Tôi mới phát hiện ra rằng việc thêm một thư mục các tệp nhanh vào dự án sẽ không hoạt động. Bạn cần tạo một nhóm đầu tiên cho thư mục, sau đó thêm các tệp swift ...


@ <lớp cụ thể>; nên được xác định, và sau đó dự án sử dụng sẽ thấy các tệp đó.
Nikita

2

Tôi có cùng một vấn đề và cuối cùng có vẻ như họ không gắn bó với cùng một mục tiêu. Lớp ObjC được gắn vào Target1 và Target2, lớp Swift chỉ được gắn vào Target1 và không hiển thị bên trong lớp ObjC.

Hy vọng điều này sẽ giúp được ai đó.


Tôi hoàn toàn bỏ qua điều này với các mục tiêu khác nhau để dàn dựng và sản xuất. Cảm ơn bạn vì câu trả lời!
Benjamin Martin

"Đính kèm" nghĩa là gì?
Iulian Onofrei

"đính kèm" = "thành viên", họ nên được liệt kê là thành viên mục tiêu
Dani.Rangelov

1

vấn đề của tôi là tôi đã bị kẹt sau khi xcode tạo tệp cầu nối nhưng tôi vẫn gặp lỗi trong tên tệp tiêu đề MYPROJECTNAME-swift.h

1.Tôi kiểm tra thiết bị đầu cuối và tìm kiếm tất cả các tệp cầu nhanh chóng được tạo tự động:

find ~/library/Developer/Xcode/DerivedData/ -name "*-Swift.h"|xargs basename|sort -

bạn thấy những gì xcode đã tạo.

  1. trong trường hợp của tôi, tôi có không gian trong tên dự án của mình và xcode thay thế đây là '_'

1

Khi bạn thêm các tệp Swift mới vào dự án, vui lòng đảm bảo rằng bạn thêm chúng vào đúng mục tiêu. Vui lòng đảm bảo rằng mọi tệp nhanh chóng bạn sẽ sử dụng đều thừa hưởng lớp NSObject và được chú thích bằng @ObjCMembers Thay đổi thành CÓ trong cài đặt bản dựng theo tùy chọn ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES. Thay đổi thành CÓ bên trong cài đặt bản dựng trong tùy chọn DEFINES_MODULE.


0

Tôi có cùng một lỗi: myProjectModule-Swift.hkhông tìm thấy tệp ", nhưng, trong trường hợp của tôi, lý do thực sự nằm ở mục tiêu triển khai sai:" Swiftkhông khả dụng trên OS X sớm hơn 10.9; vui lòng đặt MACOSX_DEPLOYMENT_TARGETthành 10.9 trở lên (hiện tại là '10 .7 ') "vì vậy, khi tôi thay đổi mục tiêu triển khai thành 10.9 - dự án đã được biên dịch thành công.


0

Vấn đề của tôi là việc tự động tạo tệp -swift.h không thể hiểu được một lớp con của CustomDebugStringConvertible. Thay vào đó, tôi đã thay đổi lớp thành một lớp con của NSObject. Sau đó, tệp -swift.h giờ đã bao gồm lớp đúng.


0

Tôi có vấn đề ở chỗ tôi sẽ thêm các lớp vào tiêu đề cầu nối mục tiêu của mình và trong các tiêu đề mục tiêu đã được nhập, chúng đang cố gắng nhập tiêu đề nhanh. Nó không như thế.

Vì vậy, trong tất cả các lớp object-c của tôi sử dụng swift, nhưng cũng được bắc cầu, khóa là để đảm bảo rằng bạn sử dụng khai báo lớp chuyển tiếp trong các tiêu đề, sau đó nhập tệp "* -Swift.h" trong tệp .m.


0

Tôi không phải thay đổi bất kỳ cài đặt nào trong bản dựng hoặc thêm @obj vào lớp.

Tất cả những gì tôi phải làm là tạo tiêu đề cầu được tạo tự động khi tôi tạo các lớp Swift vào dự án Objective-c. Và sau đó tôi phải làm

nhập "Bedtime-Swift.h" <- bên trong tệp object-c cần sử dụng tệp swift đó.


0

tốt, sau khi đọc tất cả các bình luận và cố gắng đọc và thử lại, tôi đã xoay sở để đưa các lớp nhanh chóng vào dự án Big obj-c của mình. Vì vậy, cảm ơn tất cả sự giúp đỡ. Tôi muốn chia sẻ một mẹo giúp tôi hiểu rõ hơn về quy trình. Trong lớp .m, đã đi đến dòng nhập của tên mục tiêu nhanh chóng #import "myTargetName-Swift.h" và nhấp vào phím:

lệnh + nhấp chuột -> Chuyển đến định nghĩa nhập mô tả hình ảnh ở đây

Ở đó bạn có thể thấy tất cả các bản dịch từ swift sang obj-c và có bạn sẽ tìm thấy các chức năng khác nhau được khai báo lại trong obj-c. Hy vọng mẹo này sẽ giúp bạn nhiều như nó đã giúp tôi.


0

Sử dụng các lớp Swift trong Objective-C

Nếu bạn định nhập mã trong Mục tiêu ứng dụng (Trộn Objective-C và Swift trong một dự án), bạn nên sử dụng dòng nhập tiếp theo #import "<#YourProjectName#>-Swift.h"để hiển thị mã Swift thành mã Objective-C [TrộnSwift và Objective-C trong dự án]

Trong bài viết này tôi sẽ mô tả cách nhập thư viện tĩnh Swift vào mã Objective-C

Người tiêu dùng Objective-C -> Thư viện tĩnh Swift

Phiên bản Xcode 10.2.1

Tạo thư viện tĩnh Swift

Thực hiện Create Swift static librarytheo các bổ sung tiếp theo:

API Swift phơi bày. Để sử dụng các chức năng của Swift từ Objective-C [Giới thiệu]

Sau khi xây dựng, bạn nên tìm một <product_name>-Swift.htệp nên được đặt vào DerivedSources [Không tìm thấy tệp]

Người tiêu dùng Objective-C với thư viện tĩnh Swift

Drag and dropnhị phân vào dự án Xcode [Giới thiệu]

Link Library[Biểu tượng không xác định] [Liên kết vs Nhúng]

Project editor -> select a target -> General -> Linked Frameworks and Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file
//or
Project editor -> select a target -> Build Phases -> Link Binary With Libraries -> add -> Add Others... -> point to `lib<product_name>.a` file

Thêm Library Search paths[Không tìm thấy thư viện cho] [Đường dẫn đệ quy]

Project editor -> select a target -> Build Settings -> Search Paths -> Library Search paths -> add path to the parent of `lib<product_name>.a` file

Thêm Header Search Paths[Không tìm thấy mô-đun] [Đường dẫn đệ quy]

Project editor -> select a target -> Build Settings -> Search Paths -> Header Search Paths -> add path to generated `<product_name>-Swift.h` file 

Thêm sản phẩm nào .swift filevào dự án Objective-C. [Biểu tượng không xác định] Khi Xcode yêu cầu nhấn Tạo Bridging Header(nó sẽ tạo module_name-Bridging-Header.h) và thiết lập đường dẫn đến tệp này trong

Project editor -> select a target -> Build Settings -> Swift Compiler - General -> Objective-C Bridging Header

Nhập mô-đun vào mã máy khách Objective-C [Không tìm thấy tệp] [module_name]

#import "module_name-Swift.h"

Thêm ví dụ ở đây


0

Xode 11.3.1:

Khi tôi muốn sử dụng lớp bên trong Swift trong mã objc, nó không biên dịch cho lỗi "biểu tượng không xác định" (đối với lớp bên trong và lớp bên ngoài), tôi đã kiểm tra tiêu đề "-swift.h" được tạo và cả hai lớp đều ở đó

Sau khi thử hàng giờ, tôi chuyển đổi lớp bên trong thành một lớp bình thường và nó biên dịch.

Tôi dọn dẹp dự án, xóa thư mục DerivingData và nó biên dịch.


1
Bạn đã thử thêm @objctrước khi khai báo lớp bên trong chưa?
dnnagy

cảm ơn @dnnagy, đã kiểm tra rằng đó không phải là vấn đề cú pháp.
Bill Chan

-1

Sau khi làm mọi thứ ở trên, tôi vẫn gặp lỗi. Vấn đề của tôi cuối cùng là các tệp Swift tôi cần không được thêm vào tài nguyên gói vì một số lý do.

Tôi đã sửa lỗi này bằng cách đi tới [MyTarget]> Xây dựng giai đoạn> Sao chép tài nguyên gói, sau đó nhấp vào nút dấu cộng và thêm tệp Swift.


Sao chép tài nguyên gói không nên bao gồm mã nguồn
Bill Chan
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.