在Apple关于与C API交互的文档中,他们描述了NS_ENUM以Swift枚举方式导入标记的C风格枚举的方式.这是有道理的,因为Swift中的枚举很容易作为enum值类型提供,所以很容易看到如何创建自己的.
更进一步,它说这是关于NS_OPTIONS标记的C风格选项:
Swift还导入标有
NS_OPTIONS宏的选项.而选项的行为类似于进口枚举,选项还可以支持一些位操作,如&,|和~.在Objective-C中,表示使用常量零(0)设置的空选项.在Swift中,用于nil表示没有任何选项.
鉴于optionsSwift中没有值类型,我们如何创建一个C-Style选项变量来使用?
我有一个类+扩展名swift文件.将我在另一个文件中声明的委托添加到类后,Xcode在扩展行显示"声明仅在文件范围内有效".我不知道问题是什么.
任何人都可以帮我修复它吗?
class ListViewController: UIViewController, AddItemViewControllerDelegate {...}
extension ListViewController: UITableViewDataSource{
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
tableView.deselectRowAtIndexPath(indexPath, animated: true)
performSegueWithIdentifier("ShowDetail", sender: indexPath)
}
}
Run Code Online (Sandbox Code Playgroud) 我正在阅读Swift文档,查看关于类型转换的部分.
该文档讨论了[AnyObject]从Foundation框架中获取类型的数组(NSArray *Objective-C中的内容).
首先,文档提供了这个示例:
for object in someObjects {
let movie = object as Movie
println("Movie: '\(movie.name)', dir. \(movie.director)")
}
Run Code Online (Sandbox Code Playgroud)
现在,我想稍微改变一下这个例子,我不知道所有对象都是类型的Movie,所以我会这样做:
for object in someObject {
if let movie = object as? Movie {
println("Movie: '\(movie.name', dir. \(movie.director)")
}
}
Run Code Online (Sandbox Code Playgroud)
然后,文档提供了编写第一个循环的更好方法的示例:
for movie in someObjects as [Movie] {
println("Movie: '\(movie.name)', dir. \(movie.director)")
}
Run Code Online (Sandbox Code Playgroud)
我们someObjects从一个[AnyObject]到另一个向下倾斜的地方,[Movie]所以我们不必在循环中贬低.
这让我想到,阵列可以作为一个整体选择垂头丧气吗?
if let someMovies = someObjects as? [Movie] {
for movie in someMovies { …Run Code Online (Sandbox Code Playgroud) 我的CoreData模型有一个Xcode生成的NSManagedObject类.
@objc(SomeClass) class SomeClass : NSManagedObject { /* ... */ }
Run Code Online (Sandbox Code Playgroud)
它在名为"SomeClass.swift"的文件中定义.我想扩展这个类,所以我创建了'SomeClassExtension.swift'.我像这样定义扩展:
extension SomeClass {
class func typeMethod1() {}
func instanceMethod2() {}
}
Run Code Online (Sandbox Code Playgroud)
这些扩展方法可以在此定义文件中使用,但它们在其外部不可见.是什么导致了这个问题?
我有一个自定义UITableViewCel(没什么花哨的)在Xcode 6.0上完美运行.当我尝试使用Xcode 6.1编译它时,编译器显示以下错误:
A non-failable initializer cannot chain to failable initializer 'init(style:reuseIdentifier:)' written with 'init?'
这是单元格的代码:
class MainTableViewCell: UITableViewCell {
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.setup()
}
required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setup()
}
func setup() {<...>}
}
Run Code Online (Sandbox Code Playgroud)
作为解决方案,编译器提出Propagate the failure with 'init?':
override init?(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
self.setup()
}
Run Code Online (Sandbox Code Playgroud)
我有点困惑.是否可以详细说明什么是a (non)failable initialiser以及如何使用和覆盖?
所以我正在实现一个自定义的"选择器"工具栏,就像iOS相当于单选按钮组(UISegmentedControl).只是一个单杠分为选项.
为此,我创建了一个UIControl被调用SegmentedControl和实现的自定义绘图的子类.但是,有了这样的视图,我需要选项来设置可用的选项.我本来可以从控制器访问该视图viewDidLoad()并在那里设置它们,但我喜欢使用界面构建器来处理那种东西.
所以我发现了一个名为"用户定义的运行时属性"的奇妙之处.我String用键创建了一个属性buttonValues并设置了一个值(这是一个简单的男/女选择器,所以我选择了"男|女").我发现你可以使用该函数访问这些值self.valueForKey()并传入密钥.我创建了一个解析器将该字符串转换为数组,然后添加了该drawRect()函数的功能,以使用该数组来设置按钮.
当我运行该应用程序时,我收到有关"键值编码兼容性"的错误.
所以我查了一下,发现该类必须有支持变量来存储属性.很好,我添加了一个名为的实例变量buttonValues并将其初始化为"".现在应用程序运行正常,但该值从self.valueForKey()函数中清空.我查阅了有关如何设置用户定义的运行时属性的教程,但它们没有详细说明.他们谈论Key Value Coding-compliance,就像我应该知道的那样.
我想知道我必须做些什么才能使这个工作正常,详细的细节.
我知道我可以查看自动翻译的Swift版本的Cocoa API的方法是通过命令单击Xcode中的Cocoa类型.例如,这是为UITableViewController生成的内容:
class UITableViewController : UIViewController, UITableViewDelegate, NSObjectProtocol, UIScrollViewDelegate, UITableViewDataSource {
init(style: UITableViewStyle)
var tableView: UITableView!
var clearsSelectionOnViewWillAppear: Bool // defaults to YES. If YES, any selection is cleared in viewWillAppear:
var refreshControl: UIRefreshControl!
}
Run Code Online (Sandbox Code Playgroud)
是否有另一种方法可以让Xcode生成这个Swift版本?最好是从命令行?
我正在尝试遍历所有选项卡项以通过使用枚举的开关设置一些属性:
enum TabItems {
case FirstTab
case SecondTab
case ThirdTab
}
Run Code Online (Sandbox Code Playgroud)
这是我的循环:
for item in self.tabBar.items {
switch item.tag {
case .FirstTab:
println("first tab")
default:
println("tab not exists")
}
}
Run Code Online (Sandbox Code Playgroud)
有一个错误:Enum case 'FirstTab' not found in type 'Int!'.如何在此switch语句中正确使用enum?
我无法NSRegularExpression在字符串上匹配模式,其中包含更宽的(?)Unicode字符.看起来问题是范围参数--Swift计算单个Unicode字符,而Objective-C将字符串视为由UTF-16代码单元组成.
这是我的测试字符串和两个正则表达式:
let str = "dogcow"
let dogRegex = NSRegularExpression(pattern: "d.g", options: nil, error: nil)!
let cowRegex = NSRegularExpression(pattern: "c.w", options: nil, error: nil)!
Run Code Online (Sandbox Code Playgroud)
我可以匹配第一个正则表达式没有问题:
let dogMatch = dogRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: countElements(str)))
println(dogMatch?.range) // (0, 3)
Run Code Online (Sandbox Code Playgroud)
但是第二个失败了相同的参数,因为我发送它的范围(0 ... 7)不足以涵盖整个字符串,只要NSRegularExpression有关:
let cowMatch = cowRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: countElements(str)))
println(cowMatch.range) // nil
Run Code Online (Sandbox Code Playgroud)
如果我使用不同的范围,我可以使匹配成功:
let cowMatch2 = cowRegex.firstMatchInString(str, options: nil,
range: NSRange(location: 0, length: str.utf16Count))
println(cowMatch2?.range) // (7, 3)
Run Code Online (Sandbox Code Playgroud)
但后来我不知道如何从字符串中提取匹配的文本,因为该范围超出了Swift字符串的范围.
我试图在Swift中实现多播委托功能.在Objective C中,我们有这个出色的实现
https://github.com/robbiehanson/XMPPFramework/blob/master/Utilities/GCDMulticastDelegate.m
我刚刚创建了这个基本功能:
protocol MyProtocol : class{
func testString()-> String;
}
class MulticastDelegateNode <T:AnyObject> {
weak var delegate : T?
init(object : T){
self.delegate = object;
}
}
class MulticastDelegate <T:AnyObject> {
var delegates = Array<MulticastDelegateNode<T>>()
func addDelegate(delegate : T){
var newNode = MulticastDelegateNode(object : delegate);
delegates.append(newNode);
}
func removeDelegate(delegate : AnyObject){
self.delegates = self.delegates.filter({ (node : MulticastDelegateNode) -> Bool in
return node.delegate !== delegate;
});
}
}
class OP {
var delegate = MulticastDelegate<MyProtocol>();
func process(){
//...
//make …Run Code Online (Sandbox Code Playgroud)