在Java中,有一个实用函数列表是很常见的
public class Utils {
private Utils() {
}
public static void doSomething() {
System.out.println("Utils")
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在 Swift 中,我应该使用class或struct实现类似的事情吗?或者说,这真的不重要吗?
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) 原因是立即应用的闭包{}()被视为@noescape。它不会保留捕获的自我。
和https://oleb.net/blog/2016/10/optional-non-escaping-closures/
但是,用非转义的闭包创建引用循环是不可能的-编译器可以保证闭包将释放在函数返回时捕获的所有对象。
但是,我仍然不明白为什么@nonescaping不保留闭包self,并且不需要[weak self]?有人可以用更简单的方式解释这个概念吗?
目前,我有一个看起来像这样的界面
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 中找到答案。但是,仍然无法得出具体的结论。
阅读后https://medium.com/ios-os-x-development/ios-start-an-app-without-storyboard-5f57e3251a25
我已执行以下步骤
Main.storyboard和LaunchScreen.storyboardMain.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)
当我启动模拟器时,控制台上会打印“已执行的应用程序”。
我预计应用程序启动后会看到全屏红色。但是,我只能看到整个黑屏。
我可以知道我还错过了哪些步骤吗?
如果我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参数覆盖初始化器,似乎会自动提供一个带空参数的初始化器。
我可以知道这是怎么发生的吗?
我有以下水平UIStackView
如果我添加UILabel为其子项,它将自动包裹高度内容,如下所示
我UILabel用3个相同的替换UIImageView。
每个都UIImageView具有以下属性
看起来如下
我想知道,如何使水平UIStackView换行达到其高度内容?
我希望UIStackView's 会包裹UIImageView's 内容高度。因此,我们不会观察到 的任何黄色背景UIStackView。
我可以知道,我怎样才能做到这一点?
到目前为止,我已经尝试过玩
还是没能达到我想要的结果。
以下是原图来源,为606x404
我有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) 目前,以下是我关于 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) 我们喜欢结构体的自动相等行为,只需简单地遵守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)
但是,这种方法很容易出错,特别是当我们在结构中添加新字段时。
有没有一种方法可以在不编写我们自己的 == 函数的情况下从相等比较中排除某些属性字段?
我有以下演示代码。
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)