Apple提到它们可以在一个应用程序中共存,但这是否意味着可以在技术上重用Objective-C中的旧类,同时在Swift中构建新类?
Objective-C是一种独立于平台的语言,而Swift则依赖于平台.因此,在Swift中编写非平台相关代码(业务逻辑库)并不明智.但是,在其中编写与平台相关的代码(例如,与接口相关)将非常好.不是说这是一个好主意,但它肯定是一种兴趣.
我正在尝试创建一个NSTimerin Swift但我遇到了一些麻烦.
NSTimer(timeInterval: 1, target: self, selector: test(), userInfo: nil, repeats: true)
Run Code Online (Sandbox Code Playgroud)
test() 是同一个类中的函数.
我在编辑器中收到错误:
找不到接受提供的参数的'init'的重载
当我改变selector: test()到selector: nil错误消失.
我试过了:
selector: test()selector: testselector: Selector(test())但没有任何作用,我在参考文献中找不到解决方案.
我尝试Swift在我的app中集成代码.我的应用程序是写入的Objective-C,我添加了一个Swift类.我做了这里描述的所有事情.但我的问题是Xcode没有创建-Swift.h文件,只有桥接头.所以我创造了它,但它实际上是空的.我可以在Swift中使用我所有的ObjC类,但我不能这样做.我标记了我的快速课程,@objc但没有帮助.我现在能做什么?
编辑:Apple说:"当您将Swift代码导入Objective-C时,您依靠Xcode-generated头文件将这些文件暴露给Objective-C.[...]此标题的名称是您的产品模块名称,然后添加" -Swift.h"."
现在,当我想导入该文件时,它会出错:
//MainMenu.m
#import "myProjectModule-Swift.h" //Error: 'myProjectModule-Swift.h' file not found
@implementation MainMenu
Run Code Online (Sandbox Code Playgroud)
这是我的FBManager.swift文件:
@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
}
}
Run Code Online (Sandbox Code Playgroud) 来自Apple的书"结构和类之间最重要的区别之一是结构在代码中传递时总是被复制,但类是通过引用传递的."
任何人都可以让我理解这意味着什么,对我来说,类和结构似乎是一样的.
我有一个在Objective-C中启动的项目,我试图将一些Swift代码导入到我之前编写的Objective-C相同的类文件中.
我在同一个项目中咨询过Apple Sws和Objective-C的文档,以及这样的SO 问题,但仍然无济于事:我在放入后继续得到文件未找到错误#import "NewTestApp-Swift.h"(NewTestApp是产品的名称)和模块).
这是我到目前为止所做的:
Define Modules,YES为应用程序选择.我已经尝试使用#import "NewTestApp-Swift.h"内ViewController.m,ViewController.h和AppDelegate.m但他们没有工作过.
我还做错了什么?谢谢你的帮助.
设置截图:

我目前遇到的错误:

通过addTarget传递参数的新Xcode 7.3通常适用于我,但在这种情况下,它会在标题中抛出错误.有任何想法吗?当我尝试将其更改为@objc时,它会抛出另一个
谢谢!
cell.commentButton.addTarget(self, action: #selector(FeedViewController.didTapCommentButton(_:)), forControlEvents: UIControlEvents.TouchUpInside)
Run Code Online (Sandbox Code Playgroud)
它正在调用的选择器
func didTapCommentButton(post: Post) {
}
Run Code Online (Sandbox Code Playgroud) 将方法标记为@objc与动态之间的区别是什么,何时执行一个与另一个相比?
以下是Apple对动态的定义.
dynamic将此修饰符应用于可由Objective-C表示的类的任何成员.使用动态修饰符标记成员声明时,始终使用Objective-C运行时动态调度对该成员的访问.编译器从不内联或不虚拟化对该成员的访问.
因为使用Objective-C运行时调度使用dynamic修饰符标记的声明,所以使用objc属性隐式标记它们.
我将swift框架导入Objective-c项目,如下所示:
@import MyFramework;
Run Code Online (Sandbox Code Playgroud)
问题是只有一些类被我导入框架的类识别.
被认可的班级:
public class RecognizedClass:UIViewController, WKNavigationDelegate, WKScriptMessageHandle
{ ... }
Run Code Online (Sandbox Code Playgroud)
这个课不是:
public class VeediUtils
{ ... }
Run Code Online (Sandbox Code Playgroud)
它们都是公共的,为什么第一个在工作区被识别而另一个没有?
另外我在头文件MyFramework-Swift.h中看到一个类
@interface RecognizedClass : UIViewController <WKNavigationDelegate, WKScriptMessageHandler>
Run Code Online (Sandbox Code Playgroud)
出现而另一个不
这是为什么?
还指出,当我将swift框架导入swift项目时,同样的过程也能正常工作
我没有目标C的经验,所以我遇到了一些符号的问题.在我的"AppDelegate.swift"文件中,顶部有一个"@UIMainApplication".这是什么意思?
另外,如果可能的话,您能否在C++中给我"等效"声明(如果存在)?
谢谢.
我在我的Swift文件中有一个Initializer方法,如下所示:
public init(frame: CGRect, type: NVActivityIndicatorType? = nil, color: UIColor? = nil, padding: CGFloat? = nil) {
self.type = type ?? NVActivityIndicatorView.DEFAULT_TYPE
self.color = color ?? NVActivityIndicatorView.DEFAULT_COLOR
self.padding = padding ?? NVActivityIndicatorView.DEFAULT_PADDING
super.init(frame: frame)
isHidden = true
}
Run Code Online (Sandbox Code Playgroud)
我想从我的Objective-C文件中调用此方法,但在编译时抛出它的错误.
错误:
/ Users/Desktop/old data/ChatScreenViewController.m:396:92:'NVActivityIndicatorView'没有可见的@interface声明选择器'initWithFrame:type:color:padding:'
Obj-C调用代码:
NVActivityIndicatorView *objNVActivityIndicatorView = [[NVActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 100, 100) type:NVActivityIndicatorTypeLineScalePulseOut color:[UIColor blueColor] padding:10]
Run Code Online (Sandbox Code Playgroud)
我试过的:
Objective-C在我的快速课程中添加
@objc public final class NVActivityIndicatorView: UIView
Run Code Online (Sandbox Code Playgroud)
仍然无法访问上述方法.
我的Swift文件:NVActivityIndicatorView.swift
任何想法出了什么问题?
提前致谢!
在我刚刚读到的一篇博客文章中:
'Swift 允许我们从 NSObject 扩展类以获得对象的 Objective-C 运行时功能。它还允许我们使用 @objc 注释 Swift 方法,以允许 Objective-C 运行时使用这些方法。
我不明白 Objective-C 运行时特性这个术语。这是否意味着该代码也可以在 Objective-C 项目中使用?
我有一个带有几个文件的新Swift项目,我需要添加一些Objc代码.
在Build Settings,我Objective-C Generated Interface Header Name的MyProject-Swift.h
Product Module Name并且Product Name都是MyProject.
我的Objective-C Bridging Header是MyProject/MyProject-Bridging-Header.h
我的内容Bridging Header是:
#ifndef MyProject_Bridging_Header_h
#define MyProject_Bridging_Header_h
#import "Blakey.h"
#endif
Run Code Online (Sandbox Code Playgroud)
Blakey.h 非常简单:
@import Foundation;
#import "MyProject-Swift.h"
@class KeyPair;
@interface Blakey: NSObject
- (void)createKeyPairForSeed:(NSString *)seed;
@end
Run Code Online (Sandbox Code Playgroud)
和 Blakey.m
#import <Foundation/Foundation.h>
#import "Blakey.h"
@implementation Blakey
- (void)createKeyPairForSeed:(NSString *)seed;
{
}
@end
Run Code Online (Sandbox Code Playgroud)
(旁注:我知道我的函数返回一个void,一旦修复了这个问题就会改变,所以它返回一个实际的值)
为什么Xcode中抛出一个错误在#import "MyProject-Swift.h"中Blakey.h?
swift ×11
objective-c ×8
ios ×5
xcode ×2
dynamic ×1
initializer ×1
nsobject ×1
nstimer ×1
runtime ×1
selector ×1
swift3 ×1
terminology ×1
xcode6 ×1