Swift语法问题
- 如何声明一个类的delegate属性?(Liushuai)
weak var delegate : UITableViewDelegate?
其他optional的属性如果需要弱引用也同样是用weak关键词修饰。
如果不是optional属性,需要弱引用时应使用unowned。
- 如何使用宏?(Selengge)
Swift不支持头文件或pch文件中定义的宏。旧代码中以宏方式实现的开关或函数等,应在GlobalFunctions.swift中重新定义。如检测是否iPad环境的方法由旧代码的IS_PAD宏变为新的NaviAppIsPad()函数。
需要注意的是,编译器开关在Swift中是可以判断的,例如:
// Objective-C #ifdef DEBUG ... #else ... #endif
// Swift #if DEBUG ... #else #end
- 调用类似addTarget(target: AnyObject?,action: Selector,forControlEvents controlEvents: UIControlEvents)之类的方法时,selector应如何填写?(haoyun)
selector类型可以用Selector类的构造函数创建,在这里也可以直接写方法签名字符串。需要注意的是,方法签名字符串是Objective-C的格式。
- 为何创建自己写的UIViewController子类对象时出现编译器错误“missing argument for paramter 'coder' in call”?(haoyun)
需要注意designated initializer在Swift中是强制的,子类继承时一定要注意继承并调用正确的父类构造方法。UIViewController的designated initializer是init(nibName: bundle:)方法,因此子类不但需要实现init(coder:),也需要继承init(nibName: bundle:)。创建UIViewController子类的实例时,不能使用无参数的初始化方法。
// 实现init方法 override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) { titleLabel = UILabel(frame: CGRectZero) super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil) titleLabel.text = "增强电子眼" self.viewaddSubview(titleLabel) } // 调用init方法 var eEyeVC ElectronicEyeViewController(nibName: nil, bundle: nil)
Swift -> Objective-C 问题
- 为什么我在Swift中声明的类,在Objective-C中无法引用?(Selengge)
首先需要检查ObjC文件中是否引用了Swift转ObjC的头文件。
#import "OnlineNavigation-Swift.h"
其次,Swift类要在Objective-C中使用,必须满足两个条件其一: a. 有@objc前缀 b. 是继承自ObjC类(如UIView或NSObject)
在混合工程内,不推荐使用Swift默认的无父类声明(即只使用@objc修饰),除非这个类只会被Swift代码调用。一般应至少继承NSObject,原因是这样可以让对象带上id中的若干方法及其默认实现,如responsesToSelector:,方便ObjC代码使用。
func retrieveListWithHandler(handler:((array:NSArray?, flag:Bool!) -> Void)?){ handler?(array: NSArray(),flag: true) }
原因:Swift中的可选对象类型(NSArray?)对应ObjC中的普通指针(NSArray *),但Swift中的可选值类型(Bool!)在ObjC中没有对应的类型可用,因此该方法无法暴露给ObjC。将Bool!类型改为Bool类型后,问题解决。
注释问题
- 如何使用类似ObjC中pragma mark的功能?(Selengge)
// MARK: - this is a title
- 如何使用类似ObjC中@brief、@returns等文档修饰符?(Selengge)
Swift注释默认进入方法和属性的Description标签,不需要写@brief。其他修饰符也有对应的关键词,如@returns在Swift注释里的写法是:returns:。
此外,在Swift中为方法和属性添加说明时,应使用/** */或者///作为注释头尾。
/** * 这是一个测试类,此说明会出现在description中 * :note: 一些额外说明 * :param: param1 一号参数 * :returns: 返回值的说明 */