小编Cas*_*sey的帖子

使用NSFileHandle覆盖数据

使用NSFileHandle,使用truncateFileAtOffset从文件末尾删除n个字符非常容易.

-(void)removeCharacters:(int)numberOfCharacters fromEndOfFile:(NSFileHandle*)fileHandle {
    unsigned long long fileLength = [fileHandle seekToEndOfFile];
    [fileHandle truncateFileAtOffset:fileLength - numberOfCharacters];
}
Run Code Online (Sandbox Code Playgroud)

但是,如果不必将所有剩余数据复制到内存中,覆盖文件然后将剩余数据写回文件,则无法从文件前面删除字符.

-(void)removeCharacters:(int)numberOfCharacters fromBeginningOfFile:(NSFileHandle*)fileHandle {
    [fileHandle seekToFileOffset:numberOfCharacters];

    NSData *remainingData = [fileHandle readDataToEndOfFile];
    [fileHandle truncateFileAtOffset:0];
    [fileHandle writeData:remainingData];
}
Run Code Online (Sandbox Code Playgroud)

此代码有效,但将成为大文件的责任.我错过了什么?

理想情况下,我希望能够执行replaceCharactersInRange:withData:

nsfilehandle ios

12
推荐指数
1
解决办法
1819
查看次数

Swift/ObjC循环导入

我正在开发一个主要是Objective-C的现有大型代码库,但正在转换为Swift.

在Swift中实现了新类,但是需要从现有的ObjC代码中访问其中一些类.为了遵循ObjC和Swift最佳实践,新类没有前缀,但是使用ObjC的前缀定义.

/**
 Create contrived class that is named XXClassA in ObjC and ClassA in Swift.
 */
@objc(XXClassA) class ClassA: NSObject {
    let foo = "bar"
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这一直很好; Swift代码使用ClassA()和ObjC使用[[XXClassA alloc] init].一旦删除了引用XXClassA的所有ObjC代码,@objc(XXClassA)也可以从Swift类中删除.

不幸的是,如果您有一个ObjC类引用XXClassA然后Swift代码尝试在ClassA中使用该新类,则会出现故障.

假设我创建了一个名为ObjC的类,XXClassC它使用一个XXClassA(实际上是Swift类ClassA)实例化它自己

//
//  XXClassC.h
//

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@class XXClassA;

@interface XXClassC : NSObject

-(instancetype)initWithA:(XXClassA *)classA;

@end

NS_ASSUME_NONNULL_END
Run Code Online (Sandbox Code Playgroud)

循环参考现已到位.如果我尝试从ClassA内部使用XXClassC,则初始化程序不可用.

在此输入图像描述

如果我重新定义ClassA,那么一切都很好.

class XXClassA: NSObject {
    let foo = "bar"
}
Run Code Online (Sandbox Code Playgroud)

我理解为什么会发生这种情况并且我已经有了修复,但是我想继续使用这种前缀ObjC类的模式.关于如何避免循环导入的任何想法,还要保留命名约定?

完整代码示例:https://gist.github.com/justAnotherDev/78483f9d94e40fd90c38

interop objective-c swift

6
推荐指数
1
解决办法
429
查看次数

输入文本字段时未禁用 UIKeyCommand (Swift)

我制作了一个计算器应用程序(swift),并设置了一些 UIKeyCommands,这样如果用户有蓝牙键盘,他们就可以在计算器中输入数字/符号。

他们是这样工作的:

UIKeyCommand(input: "4", modifierFlags: [], action: "TypeFourInCalculator:")
func TypeFourInCalculator(sender: UIKeyCommand) {
    btn4Press(UIButton)
}
Run Code Online (Sandbox Code Playgroud)

这一切都运行良好,当用户按下四键时向计算器添加四(即使计算器本身没有文本字段)。但是:我还有几个标准文本字段,我希望 UIKeyCommands 在用户进入其中一个文本字段时停止(这样他们就可以再次使用 BT 键盘定期输入)。在不禁用 UIKeyCommands 的情况下,在计算器函数中键入结果,而不会在文本字段中输入。

所以我尝试了这个,试图在文本字段成为第一响应者时禁用 UIKeyCommands:

let globalKeyCommands = [UIKeyCommand(input: "4", modifierFlags: [], action: "TypeFourInCalculator:"), UIKeyCommand(input: "5", modifierFlags: [], action: "TypeFiveInCalculator:")]

override var keyCommands: [UIKeyCommand]? {
    if powertextfield.isFirstResponder() == false { // if the user isn't typing into that text field
        return globalKeyCommands // use key commands
    } else { // if the user is typing
        return nil // disable those UIKeyCommands …
Run Code Online (Sandbox Code Playgroud)

bluetooth ios swift bluetooth-keyboard

5
推荐指数
1
解决办法
1386
查看次数

为NSObject子类设置init()私有

该类FooClass应仅允许通过进行交互sharedInstance。我试图防止滥用不容许任何人访问init()FooClass

我尝试了几种不同的方法,但是没有用:

使用私人关键字:

class FooClass: NSObject {
    // singleton
    static let sharedInstance = FooClass()

    let value: String

    private override init() {
        self.value = "asdf"
    }
}

// this should be a compile error, but it is not
let foo = FooClass()
Run Code Online (Sandbox Code Playgroud)

使用@available:

class FooClass: NSObject {
    // singleton
    // COMPILE ERROR - "init is unavailable. use sharedInstance"
    static let sharedInstance = FooClass()

    let value: String

    @available(*, unavailable, message="use sharedInstance")
    override init() { …
Run Code Online (Sandbox Code Playgroud)

swift

4
推荐指数
2
解决办法
5679
查看次数