2017-08-13 10 views
8

नवीनतम एक्सकोड 9 बीटा का उपयोग करके, मैं स्विफ्ट कक्षाओं पर गुणों तक पहुंचने में पूरी तरह असमर्थ हूं। यहां तक ​​कि गंध भी, मैं कक्षा को अपने आप या किसी भी चीज़ को तुरंत चालू करने के लिए एक्सेस कर सकता हूं, लेकिन इस पर संपत्तियों तक पहुंचने में पूरी तरह असमर्थ हूं।उद्देश्य-सी से स्विफ्ट क्लास तक पहुंचने में असमर्थ: "संपत्ति प्रकार की वस्तु पर नहीं मिली"

तो अगर मैं इस स्विफ्ट वर्ग है:

import UIKit 

class TestViewController: UIViewController { 
    var foobar = true 
} 

और मैं यह करने के लिए प्रयास करें:

TestViewController *testViewController = [[TestViewController alloc] init]; // success 
testViewController.foobar; // error 

वास्तव में क्या मैं गलत कर रहा हूँ? Xcode 9.

+0

तुलना करें [मैं स्विफ्ट 4 में # चयनकर्ता() के साथ @objc अनुमान को बहिष्कृत कैसे कर सकता हूं?] (Https://stackoverflow.com/q/44390378/2976878) – Hamish

उत्तर

25

ऑब्जेक्टिव-सी के लिए स्विफ्ट कोड को उजागर करने के लिए नियम के साथ नई परियोजना स्विफ्ट 4 में बदल दिया है बजाय इस प्रयास करें:

@objc var foobar = true 

एक अनुकूलन के रूप में, @objc अनुमान स्विफ्ट 4 में कम हो गई है। उदाहरण के लिए, NSObject -edived क्लास, जैसे TestViewController के भीतर एक संपत्ति, डिफ़ॉल्ट रूप से @objc infer @objc होगी।

नया डिजाइन the corresponding Swift Evolution proposal में पूरी तरह से विस्तृत है।

+0

मुझे अभी भी स्विफ्ट से इंट एंड बूल गुणों तक पहुंचने के लिए समस्या का सामना करना पड़ रहा है उद्देश्य-सी ... और इस त्रुटि को प्राप्त करने के लिए: ** संपत्ति को @objc चिह्नित नहीं किया जा सकता है क्योंकि इसका प्रकार उद्देश्य-सी ** में प्रदर्शित नहीं किया जा सकता है, कोई शर्करा? .. मैंने हेडर का उपयोग किया है "MyProject-Swift.h –

+0

** केवल स्ट्रिंग गुण उपलब्ध हैं ** –

0
  1. जब आप अपने ऑब्जेक्टिव-सी परियोजना में एक तेज फ़ाइल जोड़ते हैं, Xcode ऑब्जेक्टिव-सी ब्रिजिंग हैडर फ़ाइल जोड़ने के लिए संकेत है, तो हेडर फाइल बनाने की अनुमति होगी।
  2. अपनी उद्देश्य-सी कार्यान्वयन फ़ाइल में जहां आप TestViewController प्रॉपर्टी foobar तक पहुंच बनाना चाहते हैं। निम्नलिखित आयात वाक्यविन्यास का उपयोग करें और प्रोजेक्टनाम को अपनी परियोजना के साथ बदलें।

#import "ProjectName-Swift.h"

ऑब्जेक्टिव-सी कार्यान्वयन फ़ाइल:

#import "ViewController.h" 
#import "ProjectName-Swift.h" 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 

    TestViewController *testViewController = [[TestViewController alloc] init]; // success 
    BOOL prop = testViewController.foobar; 
    NSLog(@"Property: %d", prop); 
} 

@end 

अधिक जानकारी के लिए के माध्यम से Apple Documents

4

स्विफ्ट जाना 3.2/4.0/एक्सकोड 9.1

आप परियोजना सेटिंग्स में swift3.2 सेट (//: विन्यास = डिबग SWIFT_VERSION = 3,2)

आप (ObjC में सही आयात फ़ाइल का उपयोग कर, नीचे देखें) अपने कोड का उपयोग कर सकते हैं। आप के लिए तेजी से 4.0 परियोजना को सेट करते हैं (//: विन्यास = डिबग SWIFT_VERSION = 4,0)

आप हर संपत्ति के लिए @objc पहले जोड़ें।

तो:

स्विफ्ट 3।2:

// MyClass.swift 

@objc class MyClass: NSObject{ 

    var s1: String? 
    @objc var s2 : String? 
} 


// 

// ViewController.m 

import "MixingObjCAndSwift-Swift.h" 
#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad];   
    MyClass * mc = [MyClass new]; 
    NSString * s1 = mc.s1; 
    NSString * s2 = mc.s2; 
} 

काम करता है।

स्विफ्ट 4.0:

// MyClass.swift 

@objc class MyClass: NSObject{ 

    var s1: String? 
    @objc var s2 : String? 
} 


..... 
- (void)viewDidLoad { 
    [super viewDidLoad];   
    MyClass * mc = [MyClass new]; 
    NSString * s1 = mc.s1; 
    NSString * s2 = mc.s2; 
} 

नहीं काम करता है: संकलक विफल रहता है:

/Users....ViewController.m:24:21: संपत्ति 'एस 1' की वस्तु पर नहीं मिला टाइप करें 'MyClass *'

एस 1 के रूप में @objc के साथ प्रीपेड नहीं है।

आप लिखना चाहिए:

@objc class MyClass: NSObject{ 

    @objc var s1: String? 
    @objc var s2 : String? 
} 

(एक अतिरिक्त नोट के रूप: C/C++/ObjC फ़ाइल में, हमेशा अपने "स्थानीय" वर्ग हेडर से पहले प्रणाली/सामान्य * ज फ़ाइलें डाल दिया।)

संबंधित मुद्दे