使用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:
我正在开发一个主要是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
我制作了一个计算器应用程序(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) 该类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)