1 、Selector(oc/swift)中调用swift类中私有方法需要在方法前声明 @objc
@objc private func privateSayHello(){
print("\(__FUNCTION__)")
}
比如NStime ,performSelector中用到Selector:
[video performSelector:@selector(privateSayHello)];
2、 swfit提供oc调用接口
在swift类前加 @objc可以提供给oc调用的接口(xcode7beta4之前)
还可以让swift继承NSOject实现同样的效果。
ps:在xcode7beta4必须继承NSOject,只写 @objc会报错:Only classes that inherit from NSObject can be declared @objc
class VideoItem:NSObject{
weak var delegate:MyClassDelegate?
var name: String
init(name:String){
self.name = name
}
}
3、 修改swift中类名/属性名/方法名给oc使用
@objc(GameSwfitItem)
class GameItem:NSObject{
@objc(swiftName)
var name: String
@objc(initSwift:)
init(name:String){
self.name = name
}
}
GameSwfitItem *game = [[GameSwfitItem alloc] initSwift:@"007g"];
NSLog(@"%@",game.swiftName);
4 、提供可选协议给类使用
@objc protocol OptionalProtocol{
@objc optional func optionalMethold1()
@objc optional func optionalMethold2()
func requestMethold1()
}
局限性:加@objc的协议只能类使用(继承oc的类或加@objc的类),struct,enum不可以使用。
每个可选方法都需要加optional
swfit2中推荐可选方法用protocol eatension实现可选方法
5、 weak delegate
protocol MyClassDelegate{
func methold1()
}
class VideoItem:NSObject,MyClassDelegate{
weak var delegate:MyClassDelegate?
}
你直接这样写会报错:'weak' cannot be applied to non-class type ‘MyClassDelegate’,因为struct,enum中在arc中没有weak这种概念,不是引用计数来管理内存的。
可以在protocol前加@objc
@objc protocol MyClassDelegate{
func methold1()
}
或者在protocol声明后加class
protocol MyClassDelegate:class{
func methold1()
}
这样他们只能被类使用,其实用class更能表现问题的实质,同时避免了过多不必要的oc兼容。
相关推荐
本文将结合《ios 代码写Button小结》中的内容,深入探讨如何通过代码创建和定制UIButton。 首先,让我们了解UIButton的基本用法。在Objective-C中,我们可以使用下面的代码创建一个简单的按钮: ```objc UIButton ...
要解决这个问题,你可以进入你的 Target 设置,搜索 "Swift3 @objc Inference",并将值从 "On" 改为 "Off" 或 "Default"。这会消除警告,并确保代码符合 Swift 4 的最佳实践。 2. **String 的 subString 方法废弃**...
【iOS NSNotificationCenter通知中心使用小结】 iOS中的NSNotification中心是一个重要的通信机制,它允许对象间进行松耦合的消息传递。NSNotification与Delegate都是iOS中常见的消息传递方式,它们各有特点和适用...
```objc #import "GDataXMLNode.h" #import "GDataXMLDocument.h" ``` 然后创建一个遵循`GDataXMLParserDelegate`协议的对象,这个对象将接收并处理解析过程中的事件。例如: ```objc @interface XMLParser : ...
```objc @interface AppDelegate () @end - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { [[XGPush defaultManager] startXGWithAppID:@...
@objc func pinchAction(_ sender: UIPinchGestureRecognizer) { let scale = sender.scale guard let view = sender.view else { return } view.transform = CGAffineTransform(scaleX: scale, y: scale) ...
本文将针对这一问题进行小结,并提供相应的解决方法。 首先,我们来了解一下如何禁用Xcode 8中的部分log日志。在开发过程中,如果想要去除那些“烦人的log日志”,可以通过以下步骤操作: 1. 打开Xcode菜单栏,...
```objc UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(40, 40, 120, 44)]; [self.view addSubview:myLabel]; ``` 接着,我们来设置UILabel的文字内容。最基础的是设置默认文本,可以通过`text`...
```objc AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager]; [manager GET:@"http://example.com/resources.json" parameters:nil success:^(AFHTTPRequestOperation *...
```objc NSString *string1 = @"Hello"; NSString *string2 = @"World"; NSString *string = [NSString initWithFormat:@"%@, %@", string1, string2]; ``` 上面的代码会创建一个新的`NSString`对象,内容为"Hello,...
```objc - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return (interfaceOrientation == UIInterfaceOrientationPortrait); } ``` 然而,随着iOS6的发布,这...
```objc typedef NS_ENUM(NSInteger, Test){ TestA = 0, TestB, TestC, TestD }; ``` `NS_OPTIONS`的使用示例: ```objc typedef NS_OPTIONS(NSUInteger, Test) { TestNone = 0, TestA = 1 , TestB = 1 , ...
这个方法的优点在于它的灵活性,可以配合`options`参数进行更复杂的搜索,如忽略大小写、使用正则表达式等。例如: ```objc NSString *str = @"我是iOS开发工程师"; NSString *search = @"iOS"; NSRange range = ...
```objc NSString* path = [[NSBundle mainBundle] pathForResource:@"aaa" ofType:@"png"]; ``` 对于Documents目录,可以使用`NSSearchPathForDirectoriesInDomains`来获取: ```objc NSArray *paths = ...
#### 四、小结 通过上述介绍,我们了解了Object-C中类的基本结构以及属性的声明和使用方法。在实际开发过程中,合理地利用这些概念可以帮助开发者构建出高效且易于维护的应用程序。无论是对于初学者还是有经验的...
小结 Objective-C 的偏好设置是实现用户定制体验的关键工具。熟练掌握 `NSUserDefaults` 的使用,能够帮助开发者创建更符合用户需求的应用。通过理解偏好设置的读写、持久化、以及如何处理复杂数据,可以进一步提升...
var isDir: ObjCBool = false if !path.isEmpty && fileManager.fileExistsAtPath(path, isDirectory: &isDir) { if isDir { do { let files = try fileManager.contentsOfDirectoryAtPath(path) for file in ...