小编Nat*_*ook的帖子

如何在Swift中创建NS_OPTIONS样式的位掩码枚举?

在Apple关于与C API交互的文档中,他们描述了NS_ENUM以Swift枚举方式导入标记的C风格枚举的方式.这是有道理的,因为Swift中的枚举很容易作为enum值类型提供,所以很容易看到如何创建自己的.

更进一步,它说这是关于NS_OPTIONS标记的C风格选项:

Swift还导入标有NS_OPTIONS宏的选项.而选项的行为类似于进口枚举,选项还可以支持一些位操作,如&,|~.在Objective-C中,表示使用常量零(0)设置的空选项.在Swift中,用于nil表示没有任何选项.

鉴于optionsSwift中没有值类型,我们如何创建一个C-Style选项变量来使用?

bitwise-operators ios swift

128
推荐指数
5
解决办法
4万
查看次数

关于"声明仅在文件范围内有效"

我有一个类+扩展名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)

delegates ios swift

48
推荐指数
3
解决办法
4万
查看次数

是否可以将[AnyObject]数组转发为特定于类型的数组?

我正在阅读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)

arrays casting swift

41
推荐指数
1
解决办法
2万
查看次数

为什么我的Swift类的扩展在定义文件之外不可见?

我的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)

这些扩展方法可以在此定义文件中使用,但它们在其外部不可见.是什么导致了这个问题?

visibility nsmanagedobject ios swift

21
推荐指数
1
解决办法
9391
查看次数

Xcode 6.1中的可用初始化程序

我有一个自定义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以及如何使用和覆盖?

xcode ios swift

18
推荐指数
1
解决办法
5960
查看次数

Swift:如何实现用户定义的运行时属性

所以我正在实现一个自定义的"选择器"工具栏,就像iOS相当于单选按钮组(UISegmentedControl).只是一个单杠分为选项.

为此,我创建了一个UIControl被调用SegmentedControl和实现的自定义绘图的子类.但是,有了这样的视图,我需要选项来设置可用的选项.我本来可以从控制器访问该视图viewDidLoad()并在那里设置它们,但我喜欢使用界面构建器来处理那种东西.

所以我发现了一个名为"用户定义的运行时属性"的奇妙之处.我String用键创建了一个属性buttonValues并设置了一个值(这是一个简单的男/女选择器,所以我选择了"男|女").我发现你可以使用该函数访问这些值self.valueForKey()并传入密钥.我创建了一个解析器将该字符串转换为数组,然后添加了该drawRect()函数的功能,以使用该数组来设置按钮.

当我运行该应用程序时,我收到有关"键值编码兼容性"的错误.

所以我查了一下,发现该类必须有支持变量来存储属性.很好,我添加了一个名为的实例变量buttonValues并将其初始化为"".现在应用程序运行正常,但该值从self.valueForKey()函数中清空.我查阅了有关如何设置用户定义的运行时属性的教程,但它们没有详细说明.他们谈论Key Value Coding-compliance,就像我应该知道的那样.

我想知道我必须做些什么才能使这个工作正常,详细的细节.

xcode ios swift

16
推荐指数
1
解决办法
2万
查看次数

如何检索Cocoa API的Swift"头"文件?

我知道我可以查看自动翻译的Swift版本的Cocoa API的方法是通过命令单击Xco​​de中的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版本?最好是从命令行?

xcode cocoa objective-c swift

16
推荐指数
2
解决办法
2623
查看次数

枚举在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?

enums switch-statement swift

11
推荐指数
1
解决办法
8457
查看次数

如何在具有可变宽度Unicode字符的Swift字符串上使用NSRegularExpression?

我无法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字符串的范围.

regex objective-c nsregularexpression swift

9
推荐指数
1
解决办法
5058
查看次数

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)

cocoa ios multicastdelegate swift

9
推荐指数
2
解决办法
5485
查看次数