小编Che*_*eng的帖子

您通常使用类或结构来定义实用函数列表吗?

在Java中,有一个实用函数列表是很常见的

public class Utils {
    private Utils() {
    }

    public static void doSomething() {
        System.out.println("Utils")
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我在 Swift 中,我应该使用classstruct实现类似的事情吗?或者说,这真的不重要吗?

班级

class Utils {
    private init() {
    }

    static func doSomething() {
        print("class Utils")
    }
}
Run Code Online (Sandbox Code Playgroud)

结构体

struct Utils {
    private init() {
    }

    static func doSomething() {
        print("struct Utils")
    }
}
Run Code Online (Sandbox Code Playgroud)

ios swift

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

为什么@nonescaping闭包不需要[弱自我]?

根据/sf/answers/2670093331/

原因是立即应用的闭包{}()被视为@noescape。它不会保留捕获的自我。


https://oleb.net/blog/2016/10/optional-non-escaping-closures/

但是,用非转义的闭包创建引用循环是不可能的-编译器可以保证闭包将释放在函数返回时捕获的所有对象。


但是,我仍然不明白为什么@nonescaping不保留闭包self,并且不需要[weak self]?有人可以用更简单的方式解释这个概念吗?

ios swift

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

我们如何决定是否为接口方法提供默认的空实现(Defender Method)?

目前,我有一个看起来像这样的界面

public interface SortInfoDialogListener {
    void onSortInfoSelected(SortInfo sortInfo);
    void onSortInfoDialogDismiss(DialogInterface dialog);
}
Run Code Online (Sandbox Code Playgroud)

由于大多数实现者对 不感兴趣onSortInfoDialogDismiss,我想知道,我应该将其作为一个空的防御者方法吗?

public interface SortInfoDialogListener {
    void onSortInfoSelected(SortInfo sortInfo);
    default void onSortInfoDialogDismiss(DialogInterface dialog) {
    }
}
Run Code Online (Sandbox Code Playgroud)

我想知道,在使接口函数具有空的防御者方法之前,我还应该考虑哪些因素?

我试图在 Effective Java 3 Item 20 和 Item 21 中找到答案。但是,仍然无法得出具体的结论。

java

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

没有故事板的应用程序启动 - UIViewController 仍然不可见

阅读后https://medium.com/ios-os-x-development/ios-start-an-app-without-storyboard-5f57e3251a25

我已执行以下步骤

  1. 从项目中删除Main.storyboardLaunchScreen.storyboard
  2. 从“部署信息”下的主界面中删除“Main”
  3. Main.storyboard删除对和LaunchScreen.storyboard来自的引用Info.plist

这是上述步骤的一些屏幕截图

在此输入图像描述

在此输入图像描述

AppDelegate.swift,我做了以下修改

import UIKit

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
    var window: UIWindow?

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        
        window = UIWindow(frame: UIScreen.main.bounds)
        let viewController = ViewController()
        viewController.view.backgroundColor = UIColor.red
        window!.rootViewController = viewController
        window!.makeKeyAndVisible()
        
        print("application executed")
        
        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

当我启动模拟器时,控制台上会打印“已执行的应用程序”。

我预计应用程序启动后会看到全屏红色。但是,我只能看到整个黑屏。

我可以知道我还错过了哪些步骤吗?

ios swift

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

对于 UIView 子类,如果我们用 CGRect 参数覆盖初始化器,为什么会自动提供带空参数的初始化器?

如果我UIView按以下方式覆盖,我没有带空参数的初始化程序。

class A: UIView {
    required init?(coder: NSCoder) {
        super.init(coder: coder)
    }
}
// Error. Initializer with empty argument not supported
let a = A()
Run Code Online (Sandbox Code Playgroud)

但是,如果我UIView在下面重写,我可以获得一个带有空参数的初始化程序?

class A: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
    }
    
    required init?(coder: NSCoder) {
        super.init(coder: coder)
        self.backgroundColor = UIColor.clear
    }
}

// Why I can get a "free" init with empty argument?
let a = A()
Run Code Online (Sandbox Code Playgroud)

乍一看,对于UIView子类,如果我们用CGRect参数覆盖初始化器,似乎会自动提供一个带空参数的初始化器。

我可以知道这是怎么发生的吗?

ios swift

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

如何使水平 UIStackView 以 UIImageView 作为其子级包裹高度内容?

我有以下水平UIStackView

  1. 黄色背景
  2. 前导、顶部和尾随与安全区域相同
  3. 对齐方式 = 顶部
  4. 分配=按比例填充

UILabel 作为子项

如果我添加UILabel为其子项,它将自动包裹高度内容,如下所示

在此输入图像描述


UIImage 作为子项

UILabel用3个相同的替换UIImageView

每个都UIImageView具有以下属性

  1. 内容模式 = 宽高比匹配

看起来如下

在此输入图像描述

我想知道,如何使水平UIStackView换行达到其高度内容?

我希望UIStackView's 会包裹UIImageView's 内容高度。因此,我们不会观察到 的任何黄色背景UIStackView

我可以知道,我怎样才能做到这一点?

到目前为止,我已经尝试过玩

  1. UIStackView 和 UIImageView 的内容拥抱优先级
  2. UIStackView 和 UIImageView 的内容抗压缩优先级

还是没能达到我想要的结果。


以下是原图来源,为606x404

在此输入图像描述

ios swift

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

在处理 Localized.stringsdict 时,为什么 String.localizedStringWithFormat 能够使用相同的输入产生不同的输出?

我有Localizable.stringsdict如下

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>archived_template</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@VARIABLE@</string>
        <key>VARIABLE</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>u</string>
            <key>one</key>
            <string>Note archived</string>
            <key>other</key>
            <string>%1$d archived</string>
        </dict>
    </dict>
    <key>clear_lock_message_template</key>
    <dict>
        <key>NSStringLocalizedFormatKey</key>
        <string>%#@VARIABLE@</string>
        <key>VARIABLE</key>
        <dict>
            <key>NSStringFormatSpecTypeKey</key>
            <string>NSStringPluralRuleType</string>
            <key>NSStringFormatValueTypeKey</key>
            <string>u</string>
            <key>one</key>
            <string>%u locked note will be permanently deleted!!!</string>
            <key>other</key>
            <string>%u locked notes will be permanently deleted!!!</string>
        </dict>
    </dict>
</dict>
</plist>
Run Code Online (Sandbox Code Playgroud)

%#@VARIABLE@令我惊讶的是,即使提供相同的输入String.localizedStringWithFormat,它也能够产生不同的输出。

//
// CASE 1: clear_lock_message_template
//
var formatString : String = NSLocalizedString("clear_lock_message_template", …
Run Code Online (Sandbox Code Playgroud)

ios swift

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

如何从后台线程执行 CoreData context.count?

目前,以下是我关于 CoreData 的实现。

class CoreDataStack {
    static let INSTANCE = CoreDataStack()
    
    private init() {
    }
    
    private(set) lazy var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "xxx")
        
        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                // This is a serious fatal error. We will just simply terminate the app, rather than using error_log.
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        
        // So that when backgroundContext write to persistent store, container.viewContext will retrieve update from
        // persistent …
Run Code Online (Sandbox Code Playgroud)

core-data ios swift

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

是否有一种容易出错的方法可以在相等比较期间从结构中排除某些属性,而无需编写我们自己的 == 函数?

我们喜欢结构体的自动相等行为,只需简单地遵守Equatable协议即可。

有时,我们希望从结构相等性比较中排除某些属性。

目前,这是我们正在使用的方法。

struct House: Equatable {
    var field_0: String
    var field_1: String
    ...
    var field_50: String

    static func == (lhs: House, rhs: House) -> Bool {
        if lhs.field_0 != rhs.field_0 { return false }
        if lhs.field_1 != rhs.field_1 { return false }
        ...
        if lhs.field_48 != rhs.field_48 { return false }
        // Ommit field_49
        if lhs.field_50 != rhs.field_50 { return false }

        return true
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,这种方法很容易出错,特别是当我们在结构中添加新字段时。

有没有一种方法可以在不编写我们自己的 == 函数的情况下从相等比较中排除某些属性字段?

ios swift

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

objc_sync_enter 不适用于结构,但适用于类,背后的原因是什么?

我有以下演示代码。

struct IdGenerator {
    private var lastId: Int64
    private var set: Set<Int64> = []
    
    init() {
        self.lastId = 0
    }
    
    mutating func nextId() -> Int64 {
        objc_sync_enter(self)
        defer {
            objc_sync_exit(self)
        }
        
        repeat {
            lastId = lastId + 1
        } while set.contains(lastId)

        precondition(lastId > 0)
        
        let (inserted, _) = set.insert(lastId)
        precondition(inserted)
        
        return lastId
    }
}

var idGenerator = IdGenerator()

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func click(_ …
Run Code Online (Sandbox Code Playgroud)

multithreading ios swift

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

标签 统计

ios ×9

swift ×9

core-data ×1

java ×1

multithreading ×1