As an Android client developer, it's essential to have some knowledge of iOS development to truly consider yourself a well-rounded client developer. This article provides a guide for Android developers to learn the basics of iOS development in just one week, making it easier for them to understand and work with both platforms.
Android Studio, being the dedicated editor for Android development, offers numerous useful features that many developers are already familiar with, so I won't delve into too much detail. In contrast, Xcode, the dedicated editor for iOS development, seems to lag behind Android Studio in terms of functionality. After using it for some time, I have made the following observations:
1. Many previous plugins became unusable after version 8.2.1.
2. Swift code refactoring and other essential features are missing, which poses a significant drawback for developers.
3. The search functionality in Xcode is not as efficient as Android Studio's. In Android Studio, you can use the double shift to search for various elements, while in Xcode, you need to click on the bottom left corner, select the type, and then search.
4. The debugging features in Xcode are not as advanced as those in Android Studio, showcasing a noticeable gap between the two.
5. Auto-completion, code coloring, and commenting features tend to malfunction intermittently for unknown reasons. This serious issue often requires restarting the Mac to fix (note, not just restarting Xcode). For instance, the commenting feature may not work under certain circumstances.
6. It's a fact that Xcode is the dedicated IDE for iOS development, and you can't avoid using it. However, is there any way to make the iOS app development process a bit more enjoyable? The answer is, of course, yes. For example, here's how I deal with it:
What's even more frustrating is that Xcode may not introduce user-friendly features like being able to view partial code snippets directly anytime soon.
As a savvy developer, you might have already figured it out: using AppCode as a supplementary tool alongside Xcode is a smart choice. Additionally, for those of you who have experience with Android development, this will undoubtedly enhance your development experience. You can use the same keyboard shortcuts as before for searching, renaming, and other functions, making the process much more enjoyable.
1. Thanks to Apple for introducing the Swift programming language, which allows Android developers to easily transition into iOS development. Swift is now at version 3.1. If you plan to develop a new app and are still considering using Objective-C, it's recommended to reconsider as Swift has become quite mature. There is no longer the issue of having to rewrite a large amount of code when upgrading versions. Moreover, there are more and more open-source Swift libraries on GitHub that are sufficient for development. Even if there aren't enough libraries, you can still use Objective-C libraries if necessary.
2. As mentioned earlier, Swift is the ideal choice for language selection. Next, you will undoubtedly need to familiarize yourself with Swift syntax. I recommend you check out this book:
I bet you're wondering, how can one get started in just a week.
a. To familiarize yourself with Swift syntax, you may need to focus on concepts like let, optional, guard, switch, and tuple. You can learn the rest while working on projects, as you'll become accustomed to them after using them a few times. I can only allocate 2 days for you to learn the syntax, no more than that. PS: When learning syntax, it's best to compare it with a language you're more familiar with; I think this is the fastest way to learn.
b. In fact, the focus of iOS development is not on syntax but on familiarizing yourself with the UI libraries provided by Apple for iOS developers. I can only allocate 4 days for this part, no more than that. This part of learning can be relatively challenging. However, the method is still comparative learning. By comparing Android's four main components, I believe you can quickly find their counterparts in UIKit. Let me give you a basic example:
I believe after seeing this illustration, the following thought must have crossed your mind:
That's right, it works just like that. For other UI elements like UITextView, UITableView, UILabel, and UIImageView, I can't say much more, as they all follow the same pattern.
c. Recommended tools, resources, and books
Dash is a must-have for looking up information, as it's incredibly convenient. As for books, I don't think it's necessary to recommend any. However, if you want a recommendation, then it's Apple's developer documentation, which you can directly download and view within Dash.
As for tools, Stack Overflow and Google are what you need the most. During my learning process, I found solutions to 99% of the problems I encountered on Stack Overflow, and the remaining 1% are still unresolved.
d. What are the highlights of Swift? Protocol-oriented vs. Object-oriented programming
That's right, Swift is a protocol-oriented programming language. With powerful protocol extensions and various syntactic sugar, countless possibilities will amaze you once you discover them. Protocols can have default implementations, and you'll gradually appreciate the benefits of this feature as you work through your projects. At the very least, it can save you from writing unnecessary code with "empty implementations." Of course, some might argue that this goes against the single responsibility principle, but that's up for debate.
Functional programming, is it real or just a gimmick?
It's real, without a doubt. Swift allows you to explore functional programming.
So, the question arises, how do you create a list in iOS? Once you get familiar with it, you'll find the process quite simple:
a. The component you'll use is, of course, UITableView. So, what are the differences between UITableView and RecyclerView?
b. In RecyclerView, the list item data is handled by onCreateViewHolder and onBindViewHolder working together. onCreateViewHolder is responsible for laying out the cell structure, while onBindViewHolder is responsible for populating the structure with actual data. So, how is this done in iOS?
UITableView's methods can help you create the cell structure, and then the data binding is provided by this method in the DataSource. So, the question arises, what is UITableViewDelegate for? I'm sure you've seen iOS list items that slide left to reveal a delete option, or even allow you to long-press and drag items to rearrange their positions. These features are implemented through the corresponding interfaces provided by this delegate.
c. In essence, the implementation principles for lists on both Android and iOS platforms are quite similar. The primary difference lies in the design patterns employed. Android utilizes the adapter pattern, where all actions are managed within the adapter. Both platforms incorporate cell reuse mechanisms and may face common performance challenges with lists, which developers should carefully consider.
d. The details are relatively straightforward. As long as you comprehend the lifecycle of UIViewController and the management stack of navigationController for controllers, the similarities to Android are apparent. iOS appears to be somewhat simpler in terms of lifecycle functions, lacking an onStop function (onResume can be associated with viewWillAppear), and so forth. While the concept of fragments doesn't seem to exist in iOS, it can be likened to a UIView.
a. For instance, in iOS development, utilizing delegates is quite common. However, if not handled cautiously, it can lead to a circular reference. What is a circular reference, you may ask? Take a look at this illustration.
The UIView is added as a subview to the ViewController, and for some reason, the UIView needs to hold a reference to the ViewController, such as some events may need to be passed in through a delegate. Therefore, a circular reference can occur if not careful. So, how to solve this?
"Weak may only be applied to class-bound protocol types" is an error message you might encounter. In Java, there's a specific way to handle this. To find a solution, let's consult Stack Overflow, where we can likely locate an answer to this issue.
b. B does not appear when continuously pushing view controllers, first pushing A, and then immediately pushing B in A's viewDidLoad. My idea is to use A as a transition page (since this is often necessary, such as when there are significant differences in the page structure between the master and guest states, so I prefer to create two separate pages and use a navigation page to jump between them).
So, what is the reason for this issue? This time, I couldn't find the answer through searching, perhaps because my keywords were not accurate or my description of the problem wasn't clear enough. However, I still managed to solve it. I speculated that the time interval between the two pushes might need to be longer, so I tried the following solution:
By using a timer to create a delay, the problem was indeed resolved. Sometimes, it's good to make a guess and not be afraid to try bold solutions, as they might help solve the issue.
c. In summary, transitioning from Android development to iOS development is relatively easy for beginners who have a background in Android development. However, to become proficient in iOS development, it still takes time. To speed up this process, one can continuously challenge themselves, for example, by learning from open-source projects on GitHub, or by directly familiarizing themselves with the iOS version of their existing projects.